怎样效率的消费队列

队列简介

广义上只要是可以维持先进先出(FIFO)原则的数据存储方式都可以称为队列,小至基本的数据结构:array,list,queue等,大至各项软件服务比如带自增键的mysql表,MongoDB的collection,redis的list,又或常见的消息队列,ActiveMQ,RabbitMQ,Kafka等,更有第三方消息服务,AmazonSQS, AliyunMNS等。

在现代互联网高流量的架构中,消息队列一直占据着核心地位,多用在要求系统解耦、流量削峰、高并发缓冲、消息订阅、数据同步等强需求功能上。队列作为上下游的中间件,为下游缓冲数据的同时,也需要下游系统及时消费,以避免队列发生数据堆积,从而影响正常业务流程。

这篇文章,主要就是介绍下消息队列下游消费端要注意的一些事情,欢迎大家探讨。^_^

“安全的”消费

消费消息队列怎么样才能算是“安全的”呢?其最基本是要保证下面两点:

1. 不丢队列数据
2. 保证FIFO时序

怎么理解这两条,拿即时聊天系统(IM)的消息队列举例,就是既要保证不会漏掉某条的聊天记录,并且也要按时间先后顺序逐条显示。本文主要分享下,下游消费端的安全的消费,至于消息队列本身安全机制,这里就不在探讨。有兴趣的同学,可以去了解各种消息队列的连接池、QoS、去重等机制。

“效率的”消费

提升队列的消费效率,是每个消费端都要思考的东西。毕竟消息堆积,不仅仅是队列的负载变高,同时意味着下游的接受数据延迟变长,进而导致数据一致性、用户体验等一系列问题。

1. 优化下游消费进程

避免因为不合理的设计或开发导致的消费进程阻塞;比如第三方请求、复杂数据库处理或复杂cpu运算等场景就不适合放到消费进程中。

2. 批量处理

批量拉取消息,批量查询,批量写,提升整体吞吐率。

3. 并发多进程消费

一般情况,消息队列本身的吞吐量不是瓶颈(特大消息量的大佬们请无视.),下游消费端的消费速率才是瓶颈,在前两条不能在优化的情况下,并发是最常用的手段。

并发多进程的“安全消费”

大家都知道多进程执行的情况,因为执行环境和时间的不确定性,消息的时序没有办法保证,从而导致乱序。目前主要有两种解决方案:

1. 低粒度的时序

举个栗子,拿微信聊天来说,对于参与聊天的双方(即session)发送和收到的消息能保证时序就可以了,至于该聊天记录同其他聊天session之间的消息的FIFO先后关系根本无关紧要。这样的业务场景就使得我们在可以在session粒度上保证时序就可以了,而不需要考虑全局时序,这就是所谓的低粒度时序
有了这个妥协的时序,就使得多进程消费有了可行性。我们可以将同一个聊天session的所有消息全部映射到同一个队列上,由单进程串行按时序消费该队列,从而保证同一session的时序性。同样在一个电子商务系统,同一个订单的下单-支付-库存-物流等串行逻辑,也可以依赖orderid的低粒度时序,来实现多线程消费。

低粒度时序 示例图
2. 使用消息版本号

上游系统在生成消息时,同时添加该消息的版本号,使得下游多进程消费时,可以通过消息内的含有版本号来决定是否使用该消息。该方案适用于下游系统不关心过程数据,只关心数据结果的场景。

几种非常规的队列

自增mysql表

该队列的时序主要体现在自增键上,键值越小需先消费。多进程消费时,每个进程都会读取表中的每条数据,再通过hash映射来来决定是否在当前进程进行消费,不在当前进程映射的数据跳过。为了消费安全,可以记录每个进程当前消费的自增键,从而在进程异常退出的时候,也可以保证在下次重启时继续消费。至于hash映射,最常用算法就是键值取模,或者依赖低粒度时序字段取模。

MongoDb的collection

mongodb-collection有个自带的主键_id(ObjectID类型),ObjectID本身就是支持分布式时序的,(ObjectId的结构,有兴趣的同学可以看一下),故使用依赖该主键也可以实现队列。_id越小的记录就可以最先消费。至于多进程消费逻辑,可以参照 自增mysql表

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

推荐阅读更多精彩内容

  • 高中地理小包老师(2016.4月版) (一)自然地理部分 1 影响温度的因素(11个) 2 影响降水或水分的因素(...
    携喻阅读 1,199评论 0 0
  • 类型一位置特征: 1.半球位置:2.经纬度位置;3.海陆位置;4.相邻位置:5.交通位置:6.板块位置。 类型二地...
    携喻阅读 826评论 0 0
  • 一.综合题分析方法和技巧 1.五步操作程序: (1)细审“题干”。抓住“关键词”和“修饰词”、“限定词” 描述 详...
    携喻阅读 495评论 0 0
  • 一.综合题分析方法和技巧 1.五步操作程序: (1)细审“题干”。抓住“关键词”和“修饰词”、“限定词” 描述 详...
    携喻阅读 574评论 0 0
  • 都说胸是女人的第二张脸,很多女人都尝试着用各种方法来完美自己的胸线。可是为什么会造成乳房下垂呢?分为几点: 1一些...
    玲玲688阅读 690评论 0 1