解耦、异步、削峰数据库
RocketMQ模型简单、接口易用,在阿里大规模使用,社区活跃,单机吞吐量10万级,可用性很是高,消息理论上不会丢失;异步
4.RocketMQ是怎么保证系统高可用的?分布式
为了下降消息丢失的几率,MQ须要进行超时和重传cdn
(1) MQ-client-sender 发送消息给MQ-serverserver
(2) MQ-server接收到消息后,发送 ACK消息给发送方接口
(3) MQ-client-sender 接收到 ACK消息后,则 消息已经投递成功队列
若是上述 2 消息丢失或者超时,MQ-client-sender 内的 timer 会重发消息,直到收到 ACK消息,若是重试N次后还未收到,则回调发送失败。须要注意的是,这个过程当中 MQ-server 可能会收到同一条消息的屡次重发。内存
对每条消息,MQ系统内部必须生成一个inner-msg-id,做为去重和幂等的依据,这个内部消息ID的特性是:部署
(4) MQ-server 将消息发送给 MQ-client-receiver消息队列
(5) MQ-client-receiver 获得消息处理业务逻辑
(6) MQ-client-receiver 回复 ACK消息给 MQ-server
(7) MQ-server收到 ACK消息,将已消费的消息删除
若是上述 6 消息丢失或者超时,MQ-server 内的 timer 会重发消息,直到 MQ-server 收到ACK消息 而且 将已消费的消息删除,这个过程也可能会重发屡次,MQ-client-receiver 也可能会收到同一条消息的屡次重发。
须要强调的是,MQ-client-receiver 回ACK给 MQ-server,是消息消费业务方的主动调用行为,不能由 MQ-client-sender 自动发起,由于MQ系统不知道消费方何时真正消费成功。
为了保证业务幂等性,业务消息体中,必须有一个biz-id,做为去重和幂等的依据,这个业务ID的特性是:
最多见的业务ID有:支付ID,订单ID,帖子ID等。
欢迎关注个人公众号~ 搜索公众号: 码咖 或者 扫描下方二维码: