常见问题
1 Mq存在的意义
2 Mq常见模式
3 消息怎么路由,消息基于什么传输
4 如何保证RabbitMq消息不丢失
5 如何避免消息重复投递or重复消费
6 Mq如何保证消息顺序执行
7 Mq集群
8 Mq消息积压怎么办
9 Mq中的推与拉
10 设计一个Mq
Mq 存在的意义
消息中间件一般主要用来做 异步处理、
应用解耦、
流量削峰、
日志处理
等方面。
使用Mq 来进行消峰的场景:
Mq带来的弊端:
Mq常见模式
RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种客户端,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
Broker 简单来说就是消息队列服务器实体
公平分发就是手动ACK,按照消费者性能进行消费,Mq是不会把消息给到没有Ack的consumer上面的
topic 主题模式,最主要的功能就是把,不同消息来源的Msg放到同一个队列中。
消息怎么路由,消息基于什么传输
如何保证RabbitMq 消息不丢失
消息丢失主要分为:
1 生产者丢失消息、
2 消息列表丢失消息、
3 消费者丢失消息。
事务机制,是同步进行的。
消息持久化可以和生产者confirm机制配合使用,但是性能会下降,对于关键业务,保证关键消息的持久化不会导致系统性能瓶颈。
如何避免消息重复投递或重复消费
RabbitMQ 如何保证消息顺序执行
RabbitMq 集群
1 单机模式
2 普通集群模式
3 镜像集群模式
在N台机器上启动N个实例,创建的queue只会放在一个RabbitMq实例上,但每个Mq实例都同步queue的元数据(queue的配置信息,通过元数据,可以找到queue所在实例)。 让集群中多个节点来服务某个queue的读写操作来提高吞吐量。
死信队列,延迟队列
DeadLettter 是RabbitMq中的一种消息机制,当消费消息时队列里的消息出现了一下情况 消息将成为死信。
死信会被RabbitMq 进行特殊处理,
如果配置了 死信队列信息,那么该消息将会给丢进死信队列中,
如果没有配置,则该消息将会被丢弃
通俗理解死信队列:
死信队列,并不是什么特殊队列,只不过是绑定在死信交换机上的队列。死信交换机只不过是用来接收死信的普通交换机。
所以可以为任何类型 Direct,Fanout,Topic。
死信消息是RabbitMq 为我们做的一层保障,其实我们也可以不适用死信队列,而是在消息消费异常时,将消息主动投递到另一个交换机中,
可以从死信队列中拉去消息,然后发送邮件,短信,钉钉等通知开发人员关注,或者将消息重新投递到另一个队列然后设置过期时间,来进行延迟消费。
延迟队列:
1 延迟队列= 死信队列+TTL
2 可以通过DelayQueue,Quartz,Redis的zset等实现
MQ 消息挤压怎么办
MQ中的推拉