首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

MassTransit 探究初始

2013-01-27 
MassTransit 探究初步1.背景作为SOA基础设施,企业服务总线(ESB)是一个具有高分布性、事件驱动服务的SOA架构

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、持久化等。

 

下图为传入消息处理管道模型:

MassTransit 探究初始

 

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();            });        });    }}


热点排行