为什么要用RabbitMQ?1.解耦A系统在代码中直接调用B系统和C系统的代码。如果以后接入D系统,A系统需要修改代码,太麻烦了。2、将消息异步写入消息队列,非必要的业务逻辑异步运行,加快响应速度。3、调峰时并发量大的时候,所有的请求都直接发到数据库,导致数据库连接异常。关注《mikechen的互联网架构》公众号,回复【架构】获取《Java进阶架构思维导图&Java进阶架构文章合集》RabbitMQ原理与架构RabbitMQ的技术架构如下图所示:1.生产者(Publisher)向(Exchange)交换机发送消息在RabbitMQ中。2、交换机(Exchange)与生产者建立连接,接收生产者的消息3、消费者(Consumer)在RabbitMQ中的队列(Queue)中监听消息4、队列(Queue)Exchange发送消息到指定的Queue中,Queue与消费者进行交互5.路由(Routes)将消息从交换机转发到队列的规则\RabbitMQ核心概念1)BrokerBroker,简单来说就是一个消息队列服务器实体。\2)ExchangeExchange(消息开关),指定消息根据规则路由到哪个队列。\3)QueueQueue(消息队列载体),每条消息都会被放入一个或多个队列中。\4)Binding绑定(binding),其作用是根据路由规则绑定exchange和queue。\5)RoutingKeyRoutingKey(路由键),exchange根据这个关键字投递消息;\6)VHostvhost可以理解为一个虚拟broker,即mini-RabbitMQserver。它内部包含独立的queue、exchange、binding等,但最重要的是它有独立的权限体系,可以实现vhost范围内的用户控制。当然,从RabbitMQ的全局来看,vhost可以作为一种隔离不同权限的手段(一个典型的例子就是不同的应用程序可以运行在不同的vhosts中);\7)ProducerProducer(消息生产者),是传递消息的程序;\8)ConsumerConsumer(消息消费者),也就是接收消息的程序;\9)ChannelChannel(消息通道),在客户端的每个连接中,可以建立多个通道,每个通道代表一个会话任务。\RabbitMQ工作模式?RabbitMQ提供了6种模式:1.简单模式生产者,一个队列中有一个或多个消费者。多个消费者同时监听一个队列时,不能同时消费一条消息,而是随机消费消息,即一个队列中的一条消息只能被一个消费者消费。2.主题模式(topic)生产者,一个交换机(topicExchange),模糊匹配路由规则,多个队列,多个消费者。3、订阅发布模式(fanout)生产者,一个交换机(fanoutExchange),无路由规则,多个队列,多个消费者。生产者不是直接把消息发给队列,而是发给X交换机,然后交换机发给两个队列,两个消费者各自监听一个队列来消费消息。4、路由模式(direct)生产者,一个交换机(directExchange),路由规则,多个队列,多个消费者。消息发送到哪个队列主要是根据定义的路由规则来确定的。5.RPC模式对于RPC请求,客户端发送消息有两个属性:replyTo,设置为只为请求创建的匿名排他队列,以及correlationId,为每个请求设置一个唯一的id值。请求被发送到rpc_queue队列。RPC工作进程在队列中等待请求。当收到请求时,它会执行任务并使用replyTo字段中的队列将结果发送回客户端。客户端等待回复消息队列中的数据。当消息到来时,它会检查correlationId属性。如果与请求中的值匹配,则将响应数据返回给程序。6、工作队列注解:默认情况下,RabbitMQ会将每条消息按顺序发送给下一个消费者。平均而言,每个消费者将收到相同数量的消息。这种分发消息的方法称为循环法。以上作者简介陈睿|mikechen,10年+大厂架构经验,《BAT架构技术500期》系列文章作者,专注于互联网架构技术。更多技术文章请阅读mikechen的互联网架构合集JavaConcurrency|JVM|MySQL|Spring|Redis|Distributed|HighConcurrency
