1 RabbitMQ
1.1 什么是RabbitMQ?
采用AMQP高级消费队列协议的一种消息队列技术,最大特点就是消费并不需要确保提供方存在,实现了服务间的高度解耦.
1.2 如何保证消息的顺序性?
- 拆分多个 queue,每个 queue 一个 consumer,就是多一些 queue 而已,确实是麻烦点;
- 就一个 queue 但是对应一个 consumer,然后这个 consumer 内部用内存队列做排队,然后分发给底层不同的 worker 来处理。
1.3 为什么使用RabbitMQ
- 在分布式系统下具备异步,削峰,负载均衡等一系列高级功能
- 拥有持久化的机制,进程消息,队列中的信息也可以保存下来,
- 实现了消费者和生产者之间的解耦.
- 对于高并发场景下,利用消息队列可以使得同步访问变为串行访问量达到一定量的限流,利于数据库的操作.
- 可以使用消息队列达到异步下单的效果,排队中,后天进行逻辑下单.
1.4 使用RabbitMQ的场景
- 服务间异步通信
- 顺序消费
- 定时任务
- 请求削峰
1.5 如何避免消息重复投递或者重复消费
在消息产生时,MQ内部针对每一条生产者发送的消息生成一个inner-msg-id,作为去重的依据,避免重复消息进入队列;
在消息消费时,要求消息体中必须要有一个bizId作为去重的依据,避免同一条消息被重复消费.
2 Kafka
2.1 什么是Kafka?
2.2 :如何保证消息的顺序性?
- 写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。