【51CTO.com快译】在早年的单体架构时代,由于应用程序的内部组件存在着紧密的耦合关系,因此它们之间存在着千丝万缕的直接关联。例如,在一个简单的电子商务应用中,其结帐服务需要与支付网关服务保持通信。这就得依靠TCP的直接连接来完成。由此,我们很容易碰到如下限制场景:
- 一旦结帐消息被发出后,应用需要能够及时侦听到,并予以答复,方可继续执行下一个任务。
- 如果库存服务出现了故障,应用将进行反复尝试,直至连接被成功建立为止。
- 如果同时有大量的支付请求产生,库存服务将由于供不应求,而导致整个系统陷入瘫痪。
可以说,这些都是创建消息队列和代理(message queues/brokers)的“刚需”。
什么是消息队列
如下图所示,消息队列往往处于需要彼此通信的两个服务之间:
通信服务的流程图
如上图所示,系统1通常作为生产者(producer)会将消息添加到队列中,以便立即执行下一个任务。
在准备就绪后,系统2作为使用者(consumer)会从队列中获取消息,予以处理,并在完成后立即转向下一条消息。据此,两个应用系统实现了逻辑上的解耦关系。
同时,消息代理也有助于提高系统的可扩展性。当系统中有大量并发的“获取”操作时,队列会出现拥堵,这就意味着我们需要提供更多的取出服务。那么在上述例子的系统2中,如果有多个使用者要从队列中读取内容,以满足由大量用户的支付请求所产生的负载时,应用系统需要具一定的可扩展能力。
此外,消息队列的另一个好处是:队列本身可以被构建在计算机或服务器的内部,以分担Web应用程序的某些工作,进而提高系统的整体性能。
生产者和使用者的流程图
不知您是否听说过RabbitMQ?它是高级消息队列协议(Advanced Message Queuing Protocol,AMQP)模型的实现。
在此类消息模型中,生产者会去获取那些由服务产生的消息。就效率而言,与其我们直接产生一个消息队列,不如产生消息的交换节点。而交换节点恰好可以像中转邮局一样,去接收所有的消息,然后根据它们的处理方式予以分发。
如上图所示,一个交换节点可以连接多个队列。在上面的例子中,使用者1、2、3在系统中扮演等待队列连接的使用者。它们需要用到(consume)结帐服务。也就是说,在该流程中,结帐操作将发送一条消息给交换节点。而此类交换是通过各种绑定(bindings)被连接到不同的队列上。当然,我们可以通过绑定键(binding key),来引用这些绑定,以方便它们进入应用程序中使用者服务的子队列。
生产者和交换的流程图
我们之所以要采用消息这种方式,主要是利用其能够在系统中按需移动的灵活性。而这种灵活性在很大程度上,取决于可用于交换的不同类型。下面,让我们来讨论几种常见的交换类型:
扇出交换(Fanout Exchange)
扇出交换是将消息路由到与其绑定的所有队列,同时忽略其路由键。如果我们将N个队列绑定至扇出交换,那么在有新的消息被发布到该交换处时,此消息的副本将会被传递到所有N个队列中。
简而言之,生产者产生待交换的消息,而交换会在收到该消息后予以复制,并将其发送到自己知晓的每个队列处。可见,扇出交换是对消息进行广播路由的理想选择。
扇出交换
直接交换(Direct Exchange)
作为消息单播路由的理想选择,直接交换会基于消息路由密钥(message routing key),将消息传递到队列处。
简而言之,生产者产生待交换的消息。该消息带有对应的路由密钥信息。交换会将路由密钥与已绑定密钥进行比较,如果完全匹配的话,消息则会被转移至相应地系统中。
直接交换
主题交换(Topic Exchange)
我们事先会将队列绑定到交换主题的模式上,然后将其与消息路由键进行匹配,进而将不同的消息分别路由到一个或多个队列处。
简而言之,通过主题交换,我们可以在路由键和绑定键之间进行部分匹配。因此,该交换通常被用于消息的多播路由。
主题交流
头部交换(Header Exchange)
头部交换并不关注路由键的属性,而是根据不同的消息头部值,将各种消息路由到相应的队列中。
简而言之,路由密钥会被完全忽略,而消息会根据其头部值在系统中移动。
标头交换
默认交换(Default Exchange)
默认交换是一种由代理(broker)预先声明的不带名称(即:空字符串)的直接交换方式。简而言之,消息的路由键与队列的名称是联系在一起的。
由于每个被创建的队列都会使用与队列名称相同的路由键,来自动绑定到正确的队列上,因此它对于简单的应用而言,非常实用。
默认交换
除了上述五种灵活的交换类型,Rabbit MQ的优点还包括:云计算友好、容错能力、跨语言能力、通信安全性、消息确认能力、以及开源等特点。
原文标题:Message Queue (Rabbit MQ): A Beginners IntroductionMessage Queue (Rabbit MQ): A Beginners Introduction,作者: Vijay Thakare
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】