MQ的可靠性传递

序言

 

异构系统架构设计中必须用到的组件MQ。MQ(Message Queue)叫消息队列,也叫消息中间件。消息队列是一种基于FIFO(First In First Out)先入先出的数据结构。一般用来解决应用解耦异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。

做应用系统开发时,应用进程常见的通信方式有以下几种:

  1. 管道(Pipe):一种半双工的通信方式。父进程创建管道,得到两个文件描述符指向管道两端,父进程fork出子进程,子进程也有两个文件描述符指向管道两端,然后父子进程可以通过管道进行单向通信。
  2. 命名管道(Named Pipes):命名管道可在同一台计算机的不同进程之间或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。
  3. 消息队列(Message Queue):消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息队列就是一个消息的链表。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的。
  4. 共享内存(Share Memory):共享内存是存在于内核级别的一种资源。使得多个进程可以访问同一块内存空间。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
  5. 信号量(Semaphore):是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。
  6. 套接字(Socket):网络中不同主机上的应用进程之间进行双向通信的端点的抽象。套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
  7. 信号(Signal):通过接收信号来执行特定动作。

消息中间件就是使用的消息队列的通信方式,把A和B两个应用进程间需要通信的消息存放在消息队列中。

几种常见消息中间件

它们之间的区别引用网上的对比图,如下,

 

数据丢失问题

MQ中间件的通用消息投递过程有哪些情况可能会造成丢数据?

消息异步投递过程如下图,生产者Producer生产消息后向消息中间件Broker发送消息,Broker收到消息后将消息进行持久化(写入磁盘),然后再发送ACK确认帧给Producer。Producer接收到ACK后知道消息传输到了Broker了,不会再进行超时重传操作。Broker可以主动将消息队列中的数据推送给Consumer,也可以是Consumer定时去轮训Broker的消息队列中是否有新消息从而抽取消息。Consumer收到消息后给Broker发送ACK确认,Broker就可以把已经投递完成的消息进行删除了。

  • 发送阶段,遇到高延迟,Producer会多次重发消息,直到Broker ACK确认。过程Broker会自动去重,超时Producer产生异常,应用进行捕获提示。
  • 存储阶段,Broker先刷盘再ACK确认,即便ACK失败消息也不会丢失,多次重试直到Producer接收,可能会导致消息积压。
  • 消费阶段,Broker向Consumer发数据,一段时间未接收,自动重发,直到Consumer ACK确认,Consumer需要注意幂等处理。

可能出现的问题和处理方式:

  1. 异步刷盘(NSYNC_FLUSH)即Broker收到消息时,对消息进行持久化的同时也发送ACK 确认,如果持久化的过程失败了,那么已经发送的ACK 确认不会回滚从而导致消息丢失。需要改成同步刷盘,即持久化完毕再进行ACK 确认。
  2. 存储介质损坏,建议使用RAID10或分布式存储。
  3. 不要启动自动ACK,RabbitMQ存在此问题。
  4. 注意ActiveMQ旧版本有一个二进制消息流丢失的bug,这是由于MQ设计不足导致的数据丢失,新版本已修复。

参考链接:

1、Java IO: 管道 | 并发编程网 – ifeve.com

2、【IT老齐038】MQ中间件是如何实现可靠性投递的?_哔哩哔哩_bilibili

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值