优秀开源项目kombu源码分析之可扩展的Transport
Kombu里面使用Transport类来表示一个具体的消息代理(Broker),目前包含Redis、MongoDB、Zookeeper、Django、SQLAlchemy等类型。这种对不同类型实现相同接口的需求要求我们要设计成可扩展的方式。我之前写代码,习惯这么设计:
写一个基类Transport,定义还未实现的那些接口。
继承这个基类,实现对应的接口。
调用的时候通过一个带有别名和对应类的字典找到这个类。如果新加一种类型,就是实现这个类型的Transport,然后在对应关系的映射里面加在它。Kombu实现的更深入一些。今天我们分析下它是怎么实现的。首先Kombu也有一个基类Transport:
123456789101112131415from kombu.transport import base class Channel(AbstractChannel, base.StdChannel): # 队列和消息处理的逻辑 ... class Transport(base.Transport): Channel = Channel implements = base.Transport.implements.extend( exchange_type=frozenset(['direct', 'topic']), ... ) ...
这个base.Transport相当于预先定义了一些接口,相当于更加「基类」,这就不看了,权当这个Transport是各种消息代理的基类吧。我们看一下MongoDB类型的实现:
1234567891011121314151617from . import virtual class Channel(virtual.
...