RabbitMQ使用简谈
最近简单看了一下RabbitMQ,这里简单总结一下。(先写到现在学习的,有错误的话后面再改正)
相较于其他MQ,RMQ更加成熟稳定,所以有更大的学习的价值。
相较于ZMQ只是一个网络组件,RMQ是一个独立的服务,使用时需要服务器和RMQserver之间进行通信。RMQ服务器保证了消息的持久化和消息的正确发送。
相较于ZMQ简单的直接根据连接类型(订阅、消费)等直接生成socket,RMQ多了exchange(路由)、queue、routingkey等概念,其实这些概念都是为了创建和构架网络结构服务的。
像ZMQ一样,RMQ中路由和管道(channel)也不是一一对应的,一个管道可以声明多个路由。但是在产生管道的时候,会默认绑定一个空字符的路由(名称为“”,它的类型是direct),这个路由是不需要绑定。另外,如果已知一个队列(queue),则不需要在程序中专门声明这个队列。但是如果声明了队列,则告诉服务,如果这个队列不存在的话,则创建该队列。routingkey(路由键)是和消息的过滤相关的,只有符合client指定的路由键才能被client接收到。路由键是在绑定queue(队列)的时候指定的,所以在绑定队列的时候,也就确定了client想要接收的消息类型。
RMQ的路由有direct、fanout和topic三种类型。direct和ZMQ中的消费模式对应,一个消息只能发送给所有绑定了和消息相同routingkey的consumer中的一个,consumer之间时竞争的关系。fanout对应了publish/subscribe类型,服务会忽略路由键,将消息发给和路由连接的所有的consumer。topic其实和direct有些相似,只是他过滤路由键时不是精确地比较。
几个问题:
1、如果队列服务挂了,怎么保证消息不丢失?
可以在创建消息时,指定duration为true,即是指定将消息持久化到硬盘,这样,即是服务重启了,消息也不会丢失。
2、怎样保证消息被consumer正确处理过了?
可以指定consumer手动回复ack,这样每处理完一个消息,consumer就回复一个ack,告诉服务已经处理完,否则服务会再次发送消息。消息什么时候会被重新发送,这里没有超时的设置,只有处理的consumer挂掉之后,服务器才会重新发送消息。
3、怎样保证发送的消息比例符合服务器处理能力?
有时候不同服务器处理消息的能力是不同的,怎样保证消息恰好和处理能力相同?可以设置路由器的qos(每次发送的消息数量),这样服务器每次处理完消息后,服务才会再次发送消
息。
参考:
https://blog.csdn.net/qq_34021712/article/details/72567801