作用
RecoketMQ
主题实际就是消息类型! 生产者可以生产多种类型的消息,不同类型的消息放入对应的主题,一个主题可由一个或多个消费者消费!(消费者只能消费一个主题)
主题中有多个队列,会将消息细分:
Broker就是一个个节点! NameServer就是整个消息队列的路由器!
注意: NameServer也是集群部署的! Broker启动时会将自己的信息轮询注册到每个NameServer中!
客户端对Name Server的选择?
先随机,失败则轮询!
工作流程
生产者节点获取一个NameServer建立长连接 ==> 将路由信息缓存到本地(每30秒更新路由信息) ==> 生产者根据消息类型,从路由表中查找对应的Broker以及其中的Topic以及其中确切的队列Queue ==> 向对应的队列发送消息
(recoketmq的分布式实现是由内部的NameServer实现的;kafka的分布式是由zookeeper实现的!)
消息队列常见问题
为什么使用MQ?
限流削峰、异步解耦、数据收集!
如何保证消息不丢失?
- 确认机制:当消息被成功添加进消息队列,或成功被消费则返回一个确认消息!如果长时间没收到发送的确认响应,就会自动重试。(和TCP保证可靠性原理一致!)
如何解决重复消费问题?(保证幂等性)
- 消息本身幂等性:一个消息被重复消费后不会产生错误后果
- 使用缓存: 每个消息都已一个全局唯一ID,当一个消息需要被消费时,将此消息的ID添加进Redis缓存set集合中,如果添加失败,说民消息已经被消费过!
保证消息队列的高可用?
建立高可用集群:RecoketMQ由内部的NameServer实现;kafka的由zookeeper实现的!
保证顺序消费?
将需要消费的消息顺序投递到同一个队列中 ===> 由一个消费者消费该队列!
|