好像好久没写东西了,时隔三年回来写点东西,发现自己竟然跑偏了
大学时还整天想做图形方面的,怎么出来工作后走着走着就走弯了呢.....好悲伤...
-------------------------------------------------------------------------------------------
关于RabbitMQ,是一个由erlang实现的Message Queue,只要是在程序之间管理消息通信,想具体了解的同学可以出门左拐上百度
这里主要是画个流程图,便于理解RabbitMQ的消息流程
Message Queue 模型中,向MQ发送消息的程序称为生产者,从MQ读取消息的是消费者
先说一下RabbitMQ的各个组件
程序和RabbitMQ之间的连接是通过channel,channel是基于TCP协议之上的,一个TCP连接可以有多个channel
RabbitMQ内具体分为Queue(队列)、Exchange(交换机)和Binding(绑定)
Exchange是多个Binding的集合,每条发送到RabbitMQ的消息都会带有一个routing key ,RabbitMQ根据bingding来匹配routing key,把消息发送到符合规则的Queue,Exchange也可以有多个,生产者在发送消息的时候可以指定消息由哪个exchange来排遣,exchange并不是一个实体的线程,而是依附在Queue上的一些规则,只是一些逻辑处理,所以并不需要为了使用多线程而创建多个相同exchange,这样并不能使RabbitMQ更快。
Queue负责保存和分发接收到的消息,每个Queue都能有多个消费者连接,Queue每次收到消息后,都会选择一个消费者进行转发,转发成功后再将消息从本地移除。每个Queue都是一个独立的线程。
然后上流程图
1. 生产者产生一条消息,通过channel发向RabbitMQ,RabbitMQ收到消息后,根据消息指定的exchange(交换机) 来查找binding(绑定) 然后根据规则分发到不同的Queue
2.Queue将消息转发到具体的消费者。
3.a.消费者收到消息后,会根据自己对消息的处理对RabbitMQ进行返回,如果返回Ack,就表示已经确认这条消息,RabbitMQ会对这条消息进行处理(一般是删除)
3.b.如果消费者收到消息后处理不了,或者崩溃了,就可能不能对RabbitMQ做出返回,或者拒绝对消息处理,返回reject,RabbitMQ在一定时间没收到返回或者收到reject后,会重新派遣消息。
整个消息传递模型中,生产者只需要指定规则,然后发出消息就行,不需要知道最后是哪个消费者收到了消息,也不需要操心消费者是否收到消息,只需要往RabbitMQ发送消息就行了。