首页 > 产品中心 > 猫粮
今日头条在消息服务平台和容灾体系建设方面的实践与思考-亚博APP安全有保障

本文摘要:本篇文章整理自今日头条的沈辉在 RocketMQ 开发者沙龙中的演讲,主要和大家分享一下,RocketMQ 在微服务架构下的实践和容灾体系建设。

亚博APP安全有保障

本篇文章整理自今日头条的沈辉在 RocketMQ 开发者沙龙中的演讲,主要和大家分享一下,RocketMQ 在微服务架构下的实践和容灾体系建设。沈辉是今日头条的架构师,主要卖力 RocketMQ 在头条的落地以及架构设计,到场消息系统的时间或许一年左右。以下是本次分享的议题:头条的业务配景为什么选择 RocketMQRocketMQ 在头条的落地实践头条的容灾系统建设业务配景今日头条的服务大量使用微服务,容器数目庞大,业务线繁多, Topic 的数量也很是多。

另外,使用的语言比力繁杂,包罗 Python,Go, C++, Java, JS 等,对于基础组件的接入,维护 SDK 的成本很高。引入 RocketMQ 之前接纳的消息行列是 NSQ 和 kafka , NSQ 是纯内存的消息行列,缺少消息的持久性,不落盘直接写到 Golang 的 channel 里,在并发量高的时候 CPU 使用率很是高,其优点是可以无限水平扩展,另外,由于不需要保证消息的有序性,集群单点故障对可用性基本没有影响,所以具有很是高的可用性。

亚博APP安全有保障

我们也用到了 Kafka ,它的主要问题是在业务线和 Topic 繁多,其写入性能会泛起显着的下降,拆分集群又会增加分外的运维肩负。而且在高负载下,其故障恢复时间比力长。

所以,针对其时的状况和业务场景的需求,我们举行了一些调研,期望选择一款新的 MQ 来比力好的解决现在的逆境,最终选择了 RocketMQ。为什么选择 RocketMQ这是一个经由阿里巴巴多年双11验证过的、可以支持亿级并发的开源消息行列,是值得信任的。

其次关注一下他的特性。RocketMQ 具有高可靠性、数据持久性,和 Kafka 一样是先写 PageCache ,再落盘,而且数据有多副本;而且它的存储模型是所有的 Topic 都写到同一个 Commitlog 里,是一个append only 操作,在海量 Topic 下也能将磁盘的性能发挥到极致,而且保持稳定的写入时延。

亚博APP安全有保障

然后就是他的性能,经由我们的 benchmark ,接纳一主两从的结构,单机 qps 可以到达 14w , latency 保持在 2ms 以内。对比之前的 NSQ 和 Kafka , Kafka 的吞吐很是高,可是在多 Topic 下, Kafka 的 PCT99 毛刺会很是多,而且平均值很是长,不适合在线业务场景。

另外 NSQ 的消息首先经由 Golang 的 channel ,这是很是消耗 CPU 的,在单机 5~6w 的时候 CPU 使用率到达 50~60% ,高负载下的写延迟不稳定。另外 RocketMQ 对在线业务特性支持是很是富厚的,支持 retry , 支持并发消费,死信行列,延时消息,基于时间戳的消息回溯,另外消息体支持消息头,这个是很是有用的,可以直接支持实现消息链路追踪,否则就需要把追踪信息写到 message 的 body 里;还支持事务的消息。综合以上特性最终选择了 RocketMQ。

亚博APP安全有保障

RocketMQ 在头条的落地实践下面简朴先容下,今日头条的部署结构,如图所示:由于生产者种类繁多,我们倾向于保持客户端简朴,因为推动 SDK 升级是一个很极重的肩负,所以我们通过提供一个 Proxy 层,来保持生产端的轻量。Proxy 层是由一个尺度的 gRpc 框架实现,也可以用 thrift ,固然任何 RPC 都框架都可以实现。Producer 的 Proxy 相对比力简朴,虽然在 Producer 这边也集成了许多好比路由治理、监控等其他功效, SDK 只需实现发消息的请求,所以 SDK 的很是轻量、改动很是少,在迭代历程中也不需要一个个推业务去升级 SDK。SDK 通过服务发现去找到一个 Proxy 实例,然后建设毗连发送消息, Proxy 的事情是凭据 RPC 请求的消息转发到对应的 Broker 集群上。

Consumer Proxy 实现的是 pull 和二次 reblance 的逻辑,这个后面会讲到,相当于把 Consumer 的 pull 透传给 Brokerset , Proxy 这边会有一个消息的 cache ,一定水平上降低对 broker page cache 的污染。这个架构和滴滴的 MQ 架构有点相似,他们也是之前做了一个 Proxy ,用 thrift 做 RPC ,这对后端的扩容、运维、淘汰 SDK 的逻辑上来说都是很有须要的。

在容器以及微服务场景下为什么要做这个 Porxy ?有以下几点原因:1、 SDK 会很是简朴轻量。2、很容易对流量举行控制; Proxy 可以对生产端的流量举行控制,好比我们期望某些Broker压力比力大的时候,能够切一些流量或者说切流量到另外的机房,这种流量的调理,多情况的支持,再好比有些预公布情况、预上线情况的支持,我们 Topic 这边写入的流量可以在 Proxy 这边可以很利便的完成控制,不用修改 SDK。3,解决毗连的问题;特别是解决 Python 的问题, Python 实现的服务如果要获得高并发度,一般是接纳多历程模型,这意味着一个历程一个毗连,特别是对于部署到 Docker 里的 Python 服务,它可能一个容器里启动几百个历程,如果直接连到 Broker ,这个 Broker 上的毗连数可能到几十上百万,此时 CPU 软中断会很是高,导致读写的延时的显着上涨。4,通过 Proxy ,多了一。


本文关键词:亚博APP安全有保障

本文来源:亚博APP安全有保障-www.churchofgodcalifornianevada.com

  • 首页| 关于我们| 新闻中心| 产品中心| 业绩展示| 联系我们|
  • Add:四川省广元市河津市仁文大楼76号

    Tel:0863-287053221

    川ICP备48856128号-6 | Copyright © 亚博APP安全有保障 All Rights Reserved