Skip to content

rabbitmq

rabbitmq消费失败的原因?

过期时间
队列超长
被拒绝
无法路由
处理失败

rabbitmq的延迟消息如何实现?

使用死信队列,给消息设置过期时间,如果过期了,就会投递到死信队列中,然后再消费该队列;可能造成对头阻塞,第一个没消费完,就能不能消费第二个;

用官方插件 rabbitmq_delayed_message_exchange;消息过期后保存在erlang的数据库中,然后定时器查询出消息,再投递到x-delayed-message的交换机中;可能丢失,数据库是单节点磁盘副本;不适合10W+场景,因为定时器太多,竞争系统资源,导致时间漂移;

rabbitmq是如何做消息分发?有几种工作模式?

模式概念使用场景
简单模式一个生产者发送消息到一个队列,一个消费者从队列中接收消息。简单的消息传递场景,如日志收集、任务分发等。
工作模式多个消费者处理同一个队列中的消息。处理大量消息的场景,如批量数据处理、订单处理等。
发布订阅模式消息生产者将消息发送到交换机,交换机将消息广播到所有与之绑定的队列中,每个队列中的消费者都能接收到消息。一对多或多对多消息传递的场景,如实时消息通知、系统日志广播等。
路由模式消息生产者将消息发送到交换机,交换机根据路由键将消息发送到匹配的队列中,消费者从特定队列接收消息。基于不同条件将消息路由到不同处理逻辑的场景,如订单状态更新、事件处理等。
主题模式类似于路由模式,路由键支持通配符,可以匹配多个模式。交换机根据路由键的匹配结果将消息发送到匹配的队列中。(*:一个单词;#:多个单词)复杂条件进行消息路由的场景,如多级分类的日志处理、基于用户兴趣的消息推送等。
RPC模式远程过程调用,客户端发送请求消息到队列,服务端从队列接收请求并执行相应操作,然后将结果发送回客户端。跨服务或跨语言的远程调用场景,如分布式系统中的服务调用、跨语言集成等。

rabbitmq的整体架构?

生产者:

vhost:rabbitmq虚拟主机的概念,对资源进行隔离和分组

exchange:消息发放和接收的中心

binding:

queue:消息存储和消费的地方

消费者:

rabbitmq的死信队列

rabbitmq如何保证高可用?

普通集群:消息投递在不同的节点上; 镜像集群:每个节点上的消息都一样;

rabbitmq防止重复消费?

要选择合适的工作模式,比如:订阅消费路由主题模式会被投递到多个队列中,然后多个消费者消费; 判断幂等性,1锁,2判,3更新;主要是判断这里,比如加个uuid,消费后保存在redis中,然后查是否存在;判断表中唯一索引是否存在了;自动取消订单判断状态是否为未支付;

rabbitmq如何保证消息不丢失?

durable:丢able 生产者投递消息,用ack确认或事务(效率慢,txSelect:开启,txCommit:提交,txRollback:回滚) 交换机和队列声明时,参数durable为true,持久化; 消费者消费,用ack确认

rabbitmq如何保证消息有序性?

消息发送,自己确保是有序的;集群化部署的话,可以通过分布式锁确保消息有序。
消息到达队列之后,默认就是有序的。
消息消费,一个队列对应一个消费者,并且一个消费者一个 channel,不能并发消费,就可以确保消息有序。

rabbitmq消息堆积如何解决?

原因:要么投递太快,要么消费太慢
生产消息的速度长时间远大于消费的速度。
消费者出现异常,无法消费消息。
消费者与队列间的订阅可能出现问题,导致消息无法被消费。
消费者的消费能力降低,导致消息等待消费的时间过长。

解决: 排查是否为无法消费:被拒绝,无法路由等 优化代码,使得消费速度变快; 加多些消费者; 错峰处理; 限制生产者的速度; 设置消费者的最大消息数,当消息堆积达到一定数量时,停止接收新消息,直到已接收消息的数量减少到一定程度再继续接收。 升级配置

如何保证消息一定能发送到rabbitmq?

生产者投递消息,用ack确认或事务(效率慢,txSelect:开启,txCommit:提交,txRollback:回滚)

rabbitmq事务

生产者端投递,原子性,效率慢,

txSelect:开启,

txCommit:提交,

txRollback:回滚

rabbitmq如何实现消费端限流?

  • prefetchSize:每条消息大小的设置,0是无限制
  • prefetchCount:标识每次推送多少条消息
  • global:false标识channel级别的 true:标识消费者级别的

channel.basicQos(0,10,false);

kafka

kafka 的架构,大致储存结构

kafka如果消费者数超过分区数会怎么样?

kafka怎么保证数据的可靠投递?

kafka消费者的 offset 存在哪里?

kafka如何通过 offset 定位消息?

kafka时间轮的原理

kafka 写入高性能的原因,sendfile 和 mmap 原理,为什么不用 splice