包含原理+BAT案例实践,看完需要5分钟

本文内容预览:

  1. 是什么?为什么?
    1.1 什么是消息队列
    1.2 为什么要使用消息队列
    1.3 引入消息队列的带来了哪些问题

  2. 怎么样?
    2.1 支撑七年双11零故障的RocketMQ
    2.2 快手万亿级kafka集群的平滑扩容
    2.3 快手/美团对kafka缓存污染的优化
    2.4 CMQ在微信红包支付场景下的应用

Part1是什么?为什么?

1什么是消息队列

说到Java中的队列应该都不会陌生。其具有通过先进先出,或者双端进出的方式进行数据管理;通过阻塞以达到自动平衡负载的功能。

消息队列之所以以队列命名,起初也是因为其功能和操作,和java的本地队列有相似之处。所以,我们可以简单的认为消息队列就是为了满足分布式下各服务之间的数据传输、管理和消费的一种中间服务。

2为什么要使用消息队列

问:你们的系统中为什么要引入消息队列?

我们总归需要知晓消息队列的使用价值,以及自己的业务场景下的实际痛点才能回答为什么要用消息队列这个问题,才能回答系统引入消息队列的价值所在。

系统间解耦

以前几天在后台和关注公号的一个大佬讨论的广告流水更新的操作为例:

广告检索系统,需要感知广告贴的信息变动来更新自己的索引,但实际上检索系统和投放、物料、资产等系统间没有必要依靠接口对感知行为进行强关联,且接口的方式在维护和系统的压力方面不友好,那么,消息队列的作用就显的很重要了,各系统发布各自的消息,谁需要谁订阅,达到目的同时不会增加额外的系统调用压力。(注:builder的接口调用是为了获取最新的信息,此处可以通过压缩等方式进行优化)

因此,当系统间无实时数据交互要求,但还需要其业务信息时,可以用消息队列来达到系统间解耦的作用,只要发布方定义好消息队列格式,消费方的任何操作均可和发布方无关,减少了不必要的联调和发布冲突等影响。

服务异步化

最典型的一个例子,就是支付场景下的结果通知功能。

我们知道,一般情况下不管是app push 还是短信通知,都是比较耗时的操作。所以,没有必要因为这些非核心功能的耗时操作而影响了支付的核心操作,只要我们在支付操作完成之后,将支付结果发到短信中心指定的消息topic下,短信中心自然会接收到此消息并保证通知给用户。

图片来源于知乎回答

因此使用消息队列,让非核心的操作异步化,提高整个业务链路的高效和稳定,是很有效的。

削峰填谷

这个功能使我们本篇关注的重点,面对特殊场景如秒杀、春晚红包等万亿级流量的脉冲式压力下,一种保护我们系统的服务免于崩溃的有效手段就是消息队列。

通过消息中心高性能的存储和处理能力,将超过系统处理能力的多余流量暂时存储起来,并在系统处理能力内平缓释放出来,达到削峰的效果。

比如我们的广告计费系统,面对上万并发的商业贴检索量,数千并发的点击操作,实时接口的方式一定是不合适的,毕竟广告行为和支付行为不一样,支付失败用户还可以重试,但用户的商业贴点击行为是不可回放的,本次流量过去就过去了,因此,需要利用消息队列将扣费请求缓存下来,来保证计费系统的稳定。

其他

还如广播、事务型、最终一致性等特性,也是消息队列经常用到的功能。

3消息队列会存在哪些问题

业务上增加响应延迟

前面提到,消息队列使得业务非核心流程异步化,可以提高整个业务操作的时效性和流畅度,提升用户操作体验。,也是因为数据进入队列的原因,不可避免的会耽搁消费速度。导致业务生效不及时。

比如,之前遇到的商品推荐,产品要求推荐列表中不能出现满减秒杀的商品,以消除特殊商品对推荐效果产生影响。除了秒杀,我们还需要感知商品的上下架、黑名单、库存等等,因次,用redis中的bit多个偏移量来维护一个商品的多个状态。然后接收促销组的消息来变更推荐缓存集群中的商品状态,但由于消息的延迟,就有可能导致商品状态变更不及时的情况发生。不过只要权衡之下业务和技术上是可接受的就OK了。

架构上引入不稳定因素

消息队列的引入,相当于在原有的分布式服务链路中新增了一个系统,系统复杂度也随之变大了。同时,消息队列的作用要求其具有高性能和高可用。

所以,面对怎样部署高可用稳定集群消息发送不成功怎么重试broker数据同步策略怎么设置broker异常导致消息重发怎么幂等消费不成功怎么重试等等问题,需要中间件团队和业务系统一起努力应对。

Part2怎么样?

4支撑七年双11零故障的RocketMQ

2020 年双十一交易峰值达到 58.3W 笔/秒。RocketMQ为了阿里的交易生态有很多深度定制,这里我们只介绍其中针对高可用的优化。

个人理解,push消费模式只适合于消费速度远大于生产速度的场景,如果是大流量并发场景,基本还是以Pull消费为主。

而pull前broker和client间会进行负载均衡建立连接,那么,一旦Client被Hang住,(没有宕就不会rebalance,即时宕机也是默认20s才会rebalance),就会让broker与该client关联的队列消息无法及时被消费,导致积压。怎么办:POP,新的消费模式

<<< 左右滑动见更多 >>>

POP 消费中并不需要rebalance去分配消费队列,取而代之的是请求所有的 broker 获取消息进行消费。broker 内部会把自身的三个队列的消息根据一定的算法分配给等待的 POPClient。即使 PopClient 2 出现 hang,但内部队列的消息也会让 Pop Client1 和 Pop Client2 进行消费。这样避免了消费堆积。[1]

5快手万亿级kafka集群的平滑扩容[2]

要实现平滑,则需要让producer无感的实现partition迁移。

大致原理是将待迁移partition的数据和新的partition数据进行同步并持续一段时间,直到消费者全部赶上同步的开始节点,然后再变更路由,删除原partition,完成迁移。

<<< 左右滑动见更多 >>>

相同的数据同步思路,在facebook的分布式队列灾备方案上也有应用。

6快手/美团对kafka缓存污染的优化[3]

kafka的高性能,来源于顺序文件读写和操作系统缓存pagecache的支持,在单partition,单consumer的场景下,kafka表现的非常优秀。但是,如果同一机器上,存在不同的partition,甚至,消费模式有实时和延迟消费的混合场景,将会出现PageCache资源竞争,导致缓存污染,影响broker的服务的处理效率。

美团应对实时/延迟消费缓存污染

将数据按照时间维度分布在不同的设备中,近实时部分的数据缓存在 SSD 中,这样当出现 PageCache 竞争时,实时消费作业从 SSD 中读取数据,保证实时作业不会受到延迟消费作业影响当消费请求到达 Broker 时,Broker 直接根据其维护的消息偏移量和设备的关系从对应的设备中获取数据并返回,并且在读请求中并不会将 HDD 中读取的数据回刷到 SSD,防止出现缓存污染。同时访问路径明确,不会由于 Cache Miss 而产生的额外访问开销。

快手应对follower数据同步引起的缓存污染

broker 中引入了两个对象:一个是 block cache;另一个是 flush queue。

Producer 的写入请求在 broker 端首先会被以原 message 的形式写入 flush queue 中,之后再将数据写入到 block cache 的一个 block 中,之后整个请求就结束了。在 flush queue 中的数据会由其他线程异步地写入到磁盘中(会经历 page cache 过程)。保证queue不受follower的影响

consumer 首先会从 block cache 中检索数据,如果命中,则直接返回。否则,则从磁盘读取数据。这样的读取模式保障了 consumer 的 cache miss 读并不会填充 block cache,从而避免了产生污染。

总结

我们可以看出,解决缓存污染的基本出发点,还是要拆解不同消费速度的任务、或不同的数据生产来源,分而治之的思路避免相互间缓存的影响。

7CMQ在红包支付场景下的应用[4]

红包操作的背后流程简化为:从 A 帐号中把余额读出来,然后做减法操作,再把结果写回 A 帐号中;然后拆红包对 B 帐号做加法操作,把结果写到 B 帐号中。

而由于账务系统能承载的压力有限(和账务相关的系统一般都会由于锁、事务等原因影响处理效率),可能导致入账失败,如果按实时业务逻辑,则需要对拆红包进行实时回滚(回滚需要对A的账户再进行一次加法),而引入CMQ后,业务链路变成将失败的请求写入CMQ,由CMQ的高可用来保证数据一致,直到账务系统最终入账成功。简化了账务系统由于系统压力而导致的入账失败而导致红包账务回滚带来的额外系统操作。

Part3总结

本篇从消息队列的作用出发,从阿里双11、快手、美团、微信红包等案例,就消息队列本身的优化方案和业务对消息队列的高效利用,阐述了消息队列在高并发的优化场景下的作用。如有问题,欢迎留言讨论,相互学习。

参考资料

[1]

版权声明:本文为CSDN博主「阿里巴巴云原生」的原创文章,遵循CC 4.0 BY-SA版权协议: https://blog.csdn.net/alisystemsoftware/article/details/111314602

[2]

快手万亿级别 Kafka 集群应用实践与技术演进之路: https://www.infoq.cn/article/Q0oQzLQiay31MWiOBJH*

[3]

美团把 Kafka 作为应用层缓存的实践: https://www.infoq.cn/article/k6dqfqqihpjfepl3y3hs

[4]

春晚微信红包案例: https://cloud.tencent.com/document/product/406/4789

高并发系列:架构优化之从BAT实际案例看消息中间件的妙用相关推荐

  1. 高并发系列:存储优化之也许可能是史上最详尽的分库分表文章之一

    趣味性不强,但知识性很强,建议耐心看或者先收藏 本文内容预览: 库表会在哪天到达瓶颈? 1.1 苏宁拼购百万级库表拆分之前 1.2 京东配运平台库表拆分之前 1.3 大众点评订单库拆分之前 1.4 小 ...

  2. PHP_MVC框架开发,nosql学习,mysql优化,以及高并发web架构处理

    文章目录 定义入口文件 完成自动加载 路由类 .htaccess explode trim array_slice 实现 控制器 加载控制器 数据库 初始化连接 数据查询函数 视图 extract 其 ...

  3. 高并发推荐系统架构设计实践

    猜你喜欢 0.[免费下载]2022年1月热门报告盘点1.腾讯QQ信息流推荐业务实践2.小红书推荐中台实践3.微信视频号的实时推荐技术架构分享4.预训练模型在华为信息流推荐系统中的探索和应用5.腾讯PC ...

  4. 基于Go语言实现高并发推荐系统架构设计

    猜你喜欢 0.[免费下载]2021年12月热门报告盘点1.史上最全推荐系统传统算法合集2.推荐系统模型:多场景下的星型CTR预估模型3.新一代Rank技术在阿里巴巴推荐系统中的应用实践4.预训练模型在 ...

  5. 面试被问到如何设计微信钉钉后端高并发IM架构?懵了.....

    金九银十来临,前几天朋友出去面试-- 回来抱怨说面试时各种分布式.高并发.底层源码连环套一样打过来,幸亏基础够扎实,不然扛不住. 现在还感叹金九银十果然不是吹的,面试难度都比其他月份要高. 正值招聘求 ...

  6. 微软大佬带你深入解析websocket丨tcp自定义协议的设计丨服务器高并发场景的优化

    各个方面都离不开的websocket,只是你没有注意到 1. websocket的应用场景 2. tcp自定义协议的设计 3. 服务器高并发场景的优化 [Linux服务器开发系列]微软大佬带你深入解析 ...

  7. 浅谈千万级PV/IP规模高性能高并发网站架构

    原创作者:老男孩linux实战运维培训机构 老男孩 QQ:31333741    说明:几个月前老男孩发过一次类似的文章,本次为了参加一个朋友邀请的活动,稍微完善了一下,欢迎各位同仁一起交流网站架构技 ...

  8. 高并发网站架构与正态分布的前生今世

    高并发网站架构 什么是服务器? 不就是提供"付费"."免费"服务的高档电脑嘛! 你提到服务? 存储一个图片,读取一篇文字,观看一个动作片,计算一个账户存款,- ...

  9. 从新手到架构师,一篇就够:从100到1000万高并发的架构演进之路

    1.引言 本文以设计淘宝网的后台架构为例,介绍从一百个并发到千万级并发情况下服务端的架构的14次演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知.文章最后汇总了一些 ...

最新文章

  1. Python爬虫2-GET_POST与开发者工具
  2. 问题.beego路由设置及请求参数传递
  3. 全球及中国速冻菠萝市场消费潜力及供需前景调研报告2021-2027年
  4. 《编码的奥秘》---学习编程一年半的体会
  5. OpenCASCADE绘制测试线束:几何命令之展示
  6. 对java面向对象的三大特征的理解_Java面向对象的三大特征是什么?
  7. asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!
  8. Windows注册表操作基础代码
  9. 解决Sublime Text 2中文显示乱码问题
  10. 小程序发布上线流程_小程序如何发布?微信小程序发布流程很简单
  11. ExpandableListView 实现三级菜单中grou_item与child_item点击无响应
  12. android串口驱动服务怎么开启,Android usb转串口驱动开发
  13. python模拟登录淘宝直通车_淘宝直通车推广计划
  14. 博思特POSITAL编码器OCD58-CA1212-B15V-H3P
  15. 【过程4】——时间过得很快你的变化也很大
  16. java自行车内走线,【骑行课堂】内走线不是噩梦:“一秒“装好内走线神器
  17. 15.在springboot中的事务处理
  18. Android系统自带的层次状态机StateMachine(Hierarchical State Machine)
  19. 【网络流】【二分图最大匹配】Buaacoding1043 难题·Beihang Couple Pairing Comunity 2017
  20. Grapher中如何保存图形模板,批量处理相同格式的文件

热门文章

  1. 简单介绍oracle重置序列的方法
  2. 简单介绍基于PostgreSql 别名区分大小写的问题
  3. mask属性是css3的吗_CSS mask-image属性详细介绍(小结)
  4. linux的shell的功能,linux shell中${ }的一些特异功能
  5. jfinal js 拦截_jfinal全局数据拦截器
  6. 树形dp --- 2020 icpc 南京 M Monster Hunter
  7. php 求 相似 比,php计算title标题相似比
  8. python包里面的dll是什么_如何使用Python中的DLL文件?
  9. linux添加ssl信任根证书,linux系统添加根证书linux证书信任列表
  10. ACM/OI卡常技巧总结(clock大法好)