【.com速译】在单体架构的早期时代,由于应用内部组件之间的耦合关系紧密,存在着千丝万缕的直接关联。例如,在一个简单的电子商务应用程序中,其结账服务需要与支付网关服务保持通信。这就得靠TCP的直连来完成了。因此,我们很容易遇到如下限制场景:一旦结账消息发出,应用程序需要能够及时检测到并给出回复,然后才能进行下一步任务。如果库存服务失败,应用程序将反复尝试,直到成功建立连接。如果同时有大量支付请求,库存服务就会供不应求,整个系统就会瘫痪。可以说,这些都是创建消息队列和代理(messagequeues/brokers)的“刚需”。什么是消息队列?如下图所示,消息队列往往在两个需要相互通信的服务之间:通信服务的流程图如上图所示。System1通常作为生产者(producer)向队列中添加消息。以便可以立即执行下一个任务。准备就绪后,作为消费者的系统2从队列中获取消息,对其进行处理,并在完成后立即转到下一条消息。相应地,两个应用系统实现了逻辑上的解耦关系。同时,消息代理也有助于提高系统的可扩展性。当系统中有大量并发的“get”操作时,队列就会拥堵,这意味着我们需要提供更多的fetch服务。那么,在上述例子的系统2中,如果多个用户要从队列中读取内容来满足大量用户的支付请求所产生的负载,则应用系统需要具有一定的可扩展性。此外,消息队列的另一个好处是队列本身可以构建在计算机或服务器内部,分担Web应用程序的部分工作,从而提高系统的整体性能。生产者和消费者的流程图不知道大家有没有听说过RabbitMQ?它是高级消息队列协议(AMQP)模型的实现。在这种类型的消息模型中,生产者将获取服务产生的消息。从效率上来说,与其直接生成消息队列,还不如生成消息交换节点。而交换节点就可以像一个中转邮局一样,接收所有的消息,然后按照它们的处理方式进行分发。如上图所示,一个交换节点可以连接多个队列。在上面的示例中,消费者1、2和3充当系统中等待排队连接的消费者。他们需要消费(consume)结账服务。即在这个过程中,checkout操作会向exchange节点发送消息。并且这样的交换器通过各种绑定连接到不同的队列。当然,我们可以通过绑定键(bindingkey)来引用这些绑定,让它们在应用中进入到消费者服务的子队列中。生产者和交换者流程图我们使用消息的原因主要是利用它的灵活性,可以根据需要在系统中移动。这种灵活性在很大程度上取决于可用于交换的不同类型。下面,我们来讨论几种常见的交换器类型:扇出交换器(FanoutExchange)扇出交换器将消息路由到它绑定的所有队列,同时忽略它的路由键。如果我们将N个队列绑定到一个扇出交换器,当一个新消息发布到交换器时,消息的副本将被传递到所有N个队列。简而言之,生产者生产要交换的消息,交换器在收到消息后将其复制并将其发送到它知道的每个队列。如您所见,扇出交换非常适合消息的广播路由。FanoutExchange直接交换(DirectExchange)是消息单播路由的理想选择。DirectExchange根据消息路由键将消息传送到队列。简而言之,生产者生产要交换的消息。该消息携带相应的路由密钥信息。交换器将路由键与绑定键进行比较,如果完全匹配,则将消息传输到适当的系统。直接交换主题交换(TopicExchange)我们会预先将队列绑定到交换主题的模式上,然后与消息路由键匹配,然后将不同的消息分别路由到一个或多个队列中。简而言之,通过主题交换,我们可以在路由键和绑定键之间进行部分匹配。因此,此交换通常用于消息的多播路由。TopicExchange头交换(HeaderExchange)HeaderExchange不关注路由键的属性,而是根据不同的消息头值将各种消息路由到相应的队列中。简而言之,路由键被完全忽略,消息根据其标头值在系统中移动。HeaderExchange默认交易所(DefaultExchange)默认交易所是一种直接的交易所方式,没有经纪人预先声明的名称(即:空字符串)。简而言之,消息的路由键与队列的名称相关联。这对于简单的应用程序很有用,因为每个创建的队列都将自动绑定到具有与队列名称相同的路由键的正确队列。默认交换除了以上五种灵活的交换类型外,RabbitMQ的优势还包括:云计算友好性、容错性、跨语言能力、通信安全性、消息确认能力、开源。原标题:MessageQueue(RabbitMQ):ABeginnersIntroductionMessageQueue(RabbitMQ):ABeginnersIntroduction,作者:VijayThakare
