消息队列应用-使用异步队列就解耦了吗

消息队列作用一文介绍了为什么要使用消息队列。我们再来讨论下如何有效使用消息队列。

消息队列模式

目前主流消息队列主要由两种模式,1个是点对点模式,1个是发布订阅模式。简单做下介绍

  1. 点对点模式
    1个消息只会被一个消费者消费。可以有一个或者多个消费者同时消费一个队列,但是被消费的消息不会重复。
  2. 发布订阅模式
    消息可以被多个消费者消费。此类队列一般被称为一个topic,所有订阅该topic的consumer都可消费所有消息。

目前市面上有很多消息队列产品,ActiveMq,RabbitMQ,Kafka,ZeroMQ,golang实现的NSQ,支持的队列模式基本都可以以上面两个模式总结,只是实现方式不同,具体选型需要根据自己的使用场景选择。
比如kafka以其优异的性能应用在日志收集,hadoop技术体系等场景中,但是目前不支持消费端的ack机制,需要consumer自己实现消费的可靠性。
再比如我们考虑优先级队列的场景。kafka可以把不同优先级的消息放到topic里指定的partition,给高优先级队列提供性能更好的consumer。如果使用amq,rmq等,可以拆分出不同的queue来实现kafka的分区功能。根据自己的技术栈选择即可。

另外还要考虑技术选型的可维护性,社区的完善性等。

解耦了吗

这里再讲一下消息队列的设计问题。

提供一个场景,社交类APP里有很多实体,feed内容,评论,用户信息等,同时有一个需求,提供统一的open api,将App里的实体信息提供给第三方。

我们选择消息队列的方式将各个模块的数据同步给open api,实体信息发生的变化都都需要通过队列来发布。

使用消息队列,在部署层面上,各个模块与open api实现了解耦。我们来考虑下细节,消息体如何设计更合适。

我们可能有两种思路(可能更多,多思考)。

  1. 所有模块将消息发送到open api定义的队列里,队列的消息体由open api定义,open api消费自己的队列更新数据。
  2. 每个模块有自己的更新topic,比如评论定义自己的topic,发生变化时,将评论id连带信息发送到队列里。open api订阅各个模块的topic,组装成自己的实体信息。

思考下,这两种方式有何优缺点?


第一种方式,优点是open api实现简单,不依赖其他系统具体实现,消费消息更新数据即可。有没有什么缺点呢?还是有的。首先各个模块需要知道open api的数据定义方式(消息体),对open api还是有一定依赖。另外,如果还有一个系统,比如审核系统也需要同步评论数据做审核,评论模块还要再发送一个审核队列,数据格式可能还不相同。再有open api需要要做数据检验,不能让评论模块发成feed的数据。

第二种方式,优点是各个实体模块实现简单,不需要关注open api实现细节,同时提供topic模式,其他微服务都可以监听评论的更新消息,更加灵活。缺点就是open api承受了所有的数据转换工作,对实体模块的消息定义有些依赖。


既然各有优缺点,我们如何抉择呢?需要我们权衡下利弊。有些像CAP原理,不能完全解耦的情况下,二者取其轻。
我个人理解是这样,
设计模式里有一个基本原则是封装变化,首先看哪边变化的多,如果open api数据格式经常变化,建议选第二种方式,反之,选第一种。
第一种方式还有一个缺点是有些更新比较频繁的实体会影响其他类型实体进入open api,如果存在消费瓶颈,可以选第二种方式。第二种方式还可以对频繁更新实体增加消费能力,相当于优先级队列。

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

推荐阅读更多精彩内容