MassTransit 探究初步
1. 背景
作为SOA基础设施,企业服务总线(ESB)是一个具有高分布性、事件驱动服务的SOA架构,是当前企业集成的主流框架。
2. 简介网站:http://masstransit-project.com/
MassTransit (MT) is a framework forcreating distributed applications on the .Net platform. MT provides the abilityto subscribe to messages by type and then connect different processing nodesthough message subscriptions building a cohesive mesh of services.
主要特性:
l Bus architecture
l Sagas
l Exception management
l Transactions
l Serialization
l Headers
l Consumer lifecycle
l Built on top of Rabbit Mq
l IOC support
授权:
基于Apache 2.0,可以使用在任何环境中。
3. 架构MassTransit在消息队列(MQ)之上构建了消息总线机制,封装了对消息队列的操作,以及其它的组件,比如序列化、日志、Saga、持久化等。
下图为传入消息处理管道模型:
4. 整体分析
MassTransit的目标是作为消息机制的抽象框架,因此,它本身并不具体实现MQ,而是通过集成其它MQ产品来作为其通信层。目前官方已集成的MQ产品有MSMQ、RabbitMQ。其它非官方补充了ActiveMQ。
MassTransit在MQ之上添加了Sagas、多线程、异常处理、事务、序列化、消息头(Header)、消息使用者生命周期管理、路由、Rx(Reactive Extension 反应式扩展)集成、NHibernate集成、调试、跟踪、日志输出、加密、定时服务等。
5. 特性分析5.1. 声明式配置MassTransit本身使用了许多优秀的设计,比如对MSMQ、RabbitMQ的使用,通过在Bus构造配置中调用UseMSMQ()或UseRabbitMQ()来声明式的决定。
5.2. 通过扩展方法隐藏具体实现通过分析源码,可以发现UseXXX函数是通过定义在MassTransit.Transports.MSMQ.dll和MassTransit.Transports.RabbitMq.dll中的扩展方法实现的,这样当用户引用相应的DLL时,方法调用才会开放给用户。即用户选择具体使用哪种Transport时,是通过引用相应的DLL来决定的。DLL引用入项目后,具体MQ产品特定的配置,函数等方法也附加到了基类对象中。这样可以避免在基类中定义大量子类特定接口
MassTransit所有扩展组件均是采用这种方法,比如日志(Logging)组件。
6. 入门首先需要定义消息:
7. 高级功能使用7.1. Subscription Service参考: http://docs.masstransit-project.com/en/latest/overview/subscriptions.html
如果使用的消息队列不提供订阅共享功能,比如MSMQ,可以使用MT的SubscriptionService来实现此功能。在这种情况下,订阅信息的协调功能由一个中心管理器来完成。这个中心管理器就是运行在网路中的SubscriptionService的一个实例。每个消息总线(Bus)实例通过SubscriptionClient与其进行通信并交换订阅信息。
示例:
创建Subscription Service:
public class Program{ public static void Main() { Bus.Initialize(sbc => { sbc.ReceiveFrom("loopback://localhost/my_saga_bus"); sbc.Subscribe(subs => { subs.Saga<AuctionSaga>(new InMemorySagaRepository<AuctionSaga>()) .Permanent(); }); }); }}