- 产生数据发送消息的程序是生产者。
2、消费者
- 消费者大多时候是一个等待接收消息的程序。
- 请注意生产者,消费者和消息中间件很多时候并不在同一机器上。
- 同一个应用程序既可以是生产者又是可以是消费者。
3、交换机
-
交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定。
-
绑定(bindings):
-
交换机类型
- 1、无名队列(名字设为空串)
- 2、临时队列(随机名称的队列)
- String queueName = channel.queueDeclare().getQueue();
- 3、Fanout (扇出交换机)
- 它是将接收到的所有消息广播到它知道的所有队列中。不论你设置的路由键 是什么。
- channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
- channel.queueBind(queueName, EXCHANGE_NAME, "binding");
- 它是将接收到的所有消息广播到它知道的所有队列中。不论你设置的路由键 是什么。
- 4、Direct(直接交换机)
- producer(生产者)投递的消息被DirectExchange (交换机)转发到通过routingkey绑定到具体的某个Queue(队列),把消息放入队列,然后Consumer从Queue中订阅消息。
-
多重绑定
- 因为routingkey一样,故而虽然交换机类型为direct,但发挥了Fanout交换机的作用
- 1、无名队列(名字设为空串)
- 5、Topics 主题交换机
- 6、Federation Exchange 联邦见换机
- 将业务(Client 深圳)部署到北京的机房可以解决这个问题,但是如果(Client 深圳)调用的另些服务都部署在深圳,那么又会引发新的时延问题,总不见得将所有业务全部部署在一个机房,那么容灾又何以实现?
- 这里使用Federation 插件就可以很好地解决这个问题.
4、队列
- 队列是存储消息的数据结构。
- 队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。
- 许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。
- 队列类型:
- 1、普通队列
- 遵循先进先出原则。
- 2、死信队列
- 无法被消费的消息进入的队列。
- 某些时候由于特定的原因导致queue 中的某些消息无法被消费,这样的消息如果没有
后续的处理,就变成了死信,有死信自然就有了死信队列。
- 死信队列来源:
- 消息TTL 过期
- 队列达到最大长度(队列满了,无法再添加数据到mq 中)
- 消息被拒绝(basic.reject 或basic.nack)并且requeue=false.
- 3、延迟队列(利用死信队列实现、利用插件实现)
- 延时队列就是用来存放需要在指定时间被处理的元素的队列。
- 需要在某个事件发生之后或者之前的指定时间点完成某一项任务。
- 4、优先级队列
- 5、惰性队列
- 惰性队列会尽可能的将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中。
- 6、镜像队列
- 如果RabbitMQ 集群中只有一个Broker 节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失。
- 引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他Broker 节点之上,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。
- 7、Federation Queue联邦队列
- 联邦队列可以在多个Broker 节点(或者集群)之间为单个队列提供均衡负载的功能。一个联邦队列可以连接一个或者多个上游队列(upstream queue),并从这些上游队列中获取消息以满足本地消费者消费消息的需求。
- 1、普通队列
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)