RabbitMq

1. 结构

rabbit.PNG

消息服务器包含以下角色:

  1. vhost:虚拟机,不同虚拟机内可以有各自独立的配置,如权限
  2. exchange:用于消息分发
  3. queue:缓存消息
  4. route:队列与exchange的绑定关系,exchange收到消息后根据消息的route-key将消息转发到相应的队列。
  5. channel: 在client与消息服务器之间的tcp连接中,开辟多个channel,每个线程使用其中一个channel,避免连接数过多。

2.工作流程

  1. producer产生消息,指定消息的exchange和routekey,将消息发到指定exchange
  2. exchange收到消息,匹配routekey的队列,将消息发送到队列。
  3. consumer从监听的队列获取消息并消费。

3. exchange

direct:发送到路由键完全匹配的队列
fanout:广播到当前exchange绑定的所有队列
topic:可使用通配符部分匹配route-key,将消息发送至匹配的队列。

4. 可靠性保证

1.broker确认:生产者到broker的可靠性保证。

2.broker持久化:防止broker宕机丢失数据。

3.消费者确认

消费者接收每一条消息后都必须进行确认,只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。这里并没有用到超时机制,RabbitMQ仅通过Consumer的连接中断来确认是否需 要重新发送消息。也就是说,只要连接不中断,RabbitMQ给了Consumer足够长 的时间来处理消息。保证数据的最终一致性。
消费者确认机制有两个须注意的问题:
(1) 如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ会 认为消息没有被分发,然后重新分发给下一个订阅的消费者。
(2) 如果消费者接收到消息却没有确认消息,连接也未断开,则RabbitMQ认为 该消费者繁忙,将不会给该消费者分发更多的消息。

确认和持久化不能完全保证可靠,broker中已确认的消息,在节点宕机数据无法恢复时,消息发生丢失。
解决方案:

  • 方案1. 队列需要镜像,保证高可用
  • 方案2. 消息补偿。发送、接收消息时,需要记录消息状态,检查是否被消费。

5.消息重复消费

第4节主要保证消息至少被消费一次,但由于重发机制,消息可能会重复消费。
解决方案:幂等性保证,消息中携带唯一业务id,消费时检查id是否已消费。
场景:

  1. 插入数据库:数据库建立unique key约束
  2. 非幂等的update操作:如扣款50等更新,先检查消息id是否已被消费。

6. 延迟队列

  1. ttl
    可以对queue和message分别设置ttl,过期的消息称为dead letter。
  2. 死信队列
    可以为死信指定交换机和route-key,重新将死信进行路由,发送到队列处理。
  3. 成为deal letter条件
    1. 有过期message
    2. 队列长度达到最大值
    3. 消息被拒绝且不再重新入队

7.工作模式

simple:一个队列一个消费者
worker:一个队列多个消费者,争抢消息


image.png

发布订阅:通过队列与exchange的绑定关系完成消息分发。


image.png

8.顺序消费

需求:生产者产生一组消息,组内消息需要被顺序消费。
方案:生产者到队列、队列到消费者都需要顺序发送,并在前一条消息处理完成之后返回信号,获取下一条消息。
producer -> queue:生产的消息需放入本地队列缓存,发送一条消息时加锁;broker收到消息并发送到队列后,返回确认;生产者收到确认后释放锁发送下一条消息。
queue -> consumer: 同样须加锁,收到消费者的确认后,释放锁发送下一条消息。
此时,一个队列只能有一个消费者。如果需要多个消费者,则需要建立多个队列。生产者根据消息分组id求哈希值,将同一分组的消息发送到相同队列。

9.集群

普通集群:某节点挂了,则节点上消息不可用,需重启节点。
镜像模式:同一队列在多个节点上建立数据备份

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

推荐阅读更多精彩内容