RabbitMq
从机制上看,rabbitMq除了有topic和queue的概念,(发消息的时候要指定消息的key,这个key之后会做路由key使用),还有一个概念叫做交换机exchange,exchange有四种,drdirect、fanout、topic、header。就是说发消息给rabbitMq时,消息需要有个key,并告知发给那个exchange,exchange收到后根据key分发或者广播给queue,消费者从queue总取消息,并不直接接触到exchange。
如果没有指定exchange,默认是direct类型的exchange,如果不指定队列和交换机的绑定关系,默认按照消息的key绑定对应的queue,此时发一个消息,消息的key是什么,就会被默认交换机发送个对应的queue。
rabbitmq同样也支持主从复制和集群。但是rabbitmq的集群非常多样化,而且需要至少一台机器做为磁盘节点,可以持久化queue和exchange的信息,其他的可以为内存节点。普通集群中,只有exchange,queue这些定义是分布在所有机器上的,而queue中的数据不是冗余的,比如有三台rabbitmq组成了集群,他们共享同样的exchange,queue,但是一条消息数据落到了第一台机器上,另外两台实际上没有这条数据的。 对于整个集群的使用,这样其实没有任何问题。 但出于高可用的角度来想,还是需要完完全全的分布式集群的,万一中间有数据这台机器挂了? rabbitmq对此也有支持,把队列数据也冗余存到三台机器上,称之为镜像队列,但性能要比普通集群低,毕竟一条消息被复制到其他机器上是耗时的事情。
死信队列、延迟队列
死信队列指的是因为某些原因,队列中的某些消息变成死信后,它们被重新路由到死信交换机(DLX)绑定的队列上,该队列即为死信队列。
消息变成死信队列的原因有三种:
- 消息被拒绝,并设置requeue参数为false
- 消息过期
- 队列达到最大长度
优先级队列 x-max-priority
指的是优先级高的可以被优先消费,但是如果生产消息的速度远远赶不上消费消息的速度,那么在队列中的消息最多也只有一个,因为如果生产出了一条消息,就会被立马消费,此时也就没有优先级的概念了。