RabbitMq之怎么保证rabbitmq不丢消息和扩容

个人专题目录


怎么保证rabbitmq不丢消息(消息可靠性保障)

提出需求:如何能够保证消息的 100% 发送成功?

首先大家要明确任何一个系统都不能保证消息的 100% 投递成功,我们是可以保证消息以最高最可靠的发送给目标方。

在RabbitMQ中采用 消息补充机制 来保证消息的可靠性

1569203830553.png

步骤分析:

参与部分:消息生产者、消息消费者、数据库、三个队列(Q1、Q2、Q3)、交换机、回调检查服务、定时检查服务

  1. 消息的生产者将业务数据存到数据库中
  2. 发送消息给 队列Q1
  3. 消息的生产者等待一定的时间后,在发送一个延迟消息给队列 Q3
  4. 消息的消费方监听 Q1 队列消息,成功接收后
  5. 消息的消费方会 发送 一条确认消息给 队列Q2
  6. 回调检查服务监听 队列Q2 发送的确认消息
  7. 回调检查服务接收到确认消息后,将消息写入到 消息的数据库表中
  8. 回调检查服务同时也会监听 队列Q3延迟消息, 如果接收到消息会和数据库比对消息的唯一标识
  9. 如果发现没有接收到确认消息,那么回调检查服务就会远程调用 消息生产者,重新发送消息
  10. 重新执行 2-7 步骤,保证消息的可靠性传输
  11. 如果发送消息和延迟消息都出现异常,定时检查服务会监控 消息库中的消息数据,如果发现不一致的消息然后远程调用消息的生产者重新发送消息。

以车联网数据种类进行简单归类如下:

  1. 终端上行的数据:
    • 主流数据,量多、又频繁。(位置数据,OBD数据),能丢
    • 特别预制条件下,满足,量少,比如报警,连续报警同一个警,平台要去重,不能丢
    • 司机发起的请求,量小,不能丢
    • 司机的应答,(平台侧发起),不能丢
  1. 下行到终端数据:
    • 设置类不能丢
    • 通知类,一段时间以后 可以丢。 开会等
    • 查询类 最好不要丢
  1. 系统内配置消息,量小,一定时间内不能丢,时间过,重发该消息,消费者 要能去重。

1. 从rabbitmq自身支持的层面

  1. 消息持久化方式。(http://www.rabbitmq.com/tutorials/tutorial-two-python.html
  • exchange、queue、messages需要持久化。

  • consumer 收到后,手动送出ACK,即:producer---------------broker---------------ACK------------------consumer

  1. publisher confirm方式(http://www.rabbitmq.com/confirms.html
  • 保证传输过程中不丢,需要两处确认,producer----CONFIRM----broker-----ACK---consumer

  • 保证在producer、broker、consumer 中不丢,这里只考虑 broker崩溃或重启,需要exchange、queue、messages都要持久化

  • broker的messages持久化 完成后,才会 CONFIRM 给produer

  • consumer的处理完成后,才会ACK给broker

  1. queue 镜像方式(http://www.rabbitmq.com/ha.html
  • 这种方式可以 不使用 messages的持久化,其他跟方法2 相似,exchange、queue是否持久都可以。

2. 从应用层面支持

如果某个业务组件,在一定时间内会重复 发送该消息,是由于没有收到相应的应答,重复发送的次数是有限的,多次后,需要人工排查。

3. 从平台的操作层面支持

操作员可以重复该失败或无响应的操作

当负载增大时, RabbitMq如何扩容

1. 构建mq的集群:

(具体参考http://www.rabbitmq.com/clustering.html

  • 构建本地集群,提高broker的吞吐量。在此本地集群基础上可以配置 queue 镜像从而带来 queue HA。

  • 本地集群可以通过 federation 插件 进行WAN互联, WAN集群可以平衡 多个本地集群之间负载。

  • 本地集群的扩展,保证足够disk nodes 基础上,只要增加ram nodes 。

2. producer和consumer的 自由扩展

(具体参考http://spring.io/blog/2011/04/01/routing-topologies-for-performance-and-scalability-with-rabbitmq/

3. 提升RabbitMQ性能——开启erlang HiPE特性。

4. rabbitmq 的 flow control ,在一个 connection里面,要么使用多channel生产,要么使用多channel消费, 最好不要生产channel和消费 channel共存于一个connection内

(具体请参考http://previous.rabbitmq.com/v2_8_x/memory.html)。

消息幂等性处理

幂等性指一次和多次请求某一个资源,对于资源本身应该具有同样的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。

在MQ中指,消费多条相同的消息,得到与消费该消息一次相同的结果。

在本教程中使用 乐观锁机制 保证消息的幂等操作

1569210134160.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容