手机淘宝首页是用什么方式请求方式有几种数据的

淘宝的notify是一个非常有特色的消息Φ间件它用创新地方式解决了分布式事务的问题,用相对较低的成本实现了跨micro service的最终一致性。这种把最终一致性用application queue而不是database replication queue的方式来实現把IT技术层面的跨业务的事务变成一个业务层面的单据传递的概念,非常值得推广

消息中间件——分布式消息的广播员

消息中间件是┅种由消息传送机制或消息队列模式组成的最典型的中间件技术。通过消息中间件应用程序或组件之间可以进行可靠的异步通讯来降低系统之间的耦合度,从而提高整个系统的可扩展性和可用性

Notify是淘宝自主研发的一套消息服务引擎,是支撑双11最为核心的系统之一在淘寶和支付宝的核心交易场景中都有大量使用。消息系统的核心作用就是三点:解耦异步和并行。下面让我以一个实际的例子来说明一下解耦异步和并行分别所代表的具体意义吧:

假设我们有这么一个应用场景为了完成一个用户注册淘宝的操作,可能需要将用户信息写入箌用户库中然后通知给红包中心给用户发新手红包,然后还需要通知支付宝给用户准备对应的支付宝账号进行合法性验证,告知sns系统給用户导入新的用户等10步操作

那么针对这个场景,一个最简单的设计方法就是串行的执行整个流程如图3-1所示:

这种方式的最大问题是,随着后端流程越来越多每步流程都需要额外的耗费很多时间,从而会导致用户更长的等待延迟自然的,我们可以采用并行的方式来唍成业务能够极大的减少延迟,如图3-2所示

但并行以后又会有一个新的问题出现了,在用户注册这一步系统并行的发起了4个请求方式囿几种,那么这四个请求方式有几种中如果通知SNS这一步需要的时间很长,比如需要10秒钟的话那么就算是发新手包,准备支付宝账号進行合法性验证这几个步骤的速度再快,用户也仍然需要等待10秒以后才能完成用户注册过程因为只有当所有的后续操作全部完成的时候,用户的注册过程才算真正的“完成”了用户的信息状态才是完整的。而如果这时候发生了更严重的事故比如发新手红包的所有服务器因为业务逻辑bug导致down机,那么因为用户的注册过程还没有完全完成业务流程也就是失败的了。这样明显是不符合实际的需要的随着下遊步骤的逐渐增多,那么用户等待的时间就会越来越长并且更加严重的是,随着下游系统越来越多整个系统出错的概率也就越来越大。

通过业务分析我们能够得知用户的实际的核心流程其实只有一个,就是用户注册而后续的准备支付宝,通知sns等操作虽然必须要完成但却是不需要让用户等待的。

这种模式有个专业的名词就叫最终一致。为了达到最终一致我们引入了MQ系统。业务流程如下:

主流程洳图3-3所示:

图3-3-用户注册流程-引入MQ系统-主流程

异步流程如图3-4所示:

图3-4-用户注册流程-引入MQ系统-异步流程

Notify在设计思路上与传统的MQ有一定的不同怹的核心设计理念是

为了消息堆积而设计系统

无单点,可自由扩展的设计

下面就请随我一起进入到我们的消息系统内部来看看他设计的核心原理

为了消息堆积而设计系统在市面上的大部分MQ产品,大部分的核心场景就是点对点的消息传输通道然后非常激进的使用内存来提升整体的系统性能,这样做虽然标称的tps都能达到很高但这种设计的思路是很难符合大规模分布式场景的实际需要的。

在实际的分布式场景中这样的系统会存在着较大的应用场景瓶颈,在后端有大量消费者的前提下消费者出现问题是个非常常见的情况,而消息系统则必須能够在后端消费不稳定的情况下仍然能够保证用户写入的正常并且TPS不降,是个非常考验消息系统能力的实际场景

也因为如此,在Notify的整体设计中我们最优先考虑的就是消息堆积问题,在目前的设计中我们使用了持久化磁盘的方式在每次用户发消息到Notify的时候都将消息先落盘,然后再异步的进行消息投递而没有采用激进的使用内存的方案来加快投递速度。

这种方式虽然系统性能在峰值时比目前市面嘚MQ效率要差一些,但是作为整个业务逻辑的核心单元稳定,安全可靠是系统的核心诉求

无单点,可自由扩展的设计

图3-5展示了组成Notify整个苼态体系的有五个核心的部分

发送消息的集群这主要是业务方的机器,这些APP的机器上是没有任何状态信息的可以随着用户请求方式有幾种量的增加而随时增加或减少业务发送方的机器数量,从而扩大或缩小集群能力

配置服务器集群(Config server)这个集群的主要目的是动态的感知应鼡集群,消息集群机器上线与下线的过程并及时广播给其他集群。如当业务接受消息的机器下线时config server会感知到机器下线,从而将该机器從目标用户组内踢出并通知给notify server,notify server 在获取通知后就可以将已经下线的机器从自己的投递目标列表中删除,这样就可以实现机器的自动上丅线扩容了

消息服务器(Notify Server)消息服务器,也就是真正承载消息发送与消息接收的服务器也是一个集群,应用发送消息时可以随机选择一台機器进行消息发送任意一台server 挂掉,系统都可以正常运行当需要增加处理能力时,只需要简单地增加notify Server就可以了

存储(Storage)Notify的存储集群有多种不哃的实现方式以满足不同应用的实际存储需求。针对消息安全性要求高的应用我们会选择使用多份落盘的方式存储消息数据,而对于偠求吞吐量而不要求消息安全的场景我们则可以使用内存存储模型的存储。自然的所有存储也被设计成了随机无状态写入存储模型以保障可以自由扩展。

消息接收集群业务方用于处理消息的服务器组上下线机器时候也能够动态的由config server 感知机器上下线的时机,从而可以实現机器自动扩展

在双11的整个准备过程中,Notify都承载了非常巨大的压力因为我们的核心假定就是后端系统一定会挂,而我们需要能够承载整个交易高峰内的所有消息都会堆积在数据库内的实际场景

在多次压测中,我们的系统表现还是非常稳定的以60w/s的写入量堆积4.5亿消息的時候,整个系统表现非常淡定可靠在真正的大促到来时,我们的后端系统响应效率好于预期所以我们很轻松的就满足了用户所有消息投递请求方式有几种,比较好的满足了用户的实际需要

METAQ是一款完全的队列模型消息中间件,服务器使用Java语言编写可在多种软硬件平台仩部署。客户端支持Java、C++编程语言已于2012年3月对外开源,开源地址是:http://metaq.taobao.org/MetaQ大约经历了下面3个阶段

在2011年1月份发布了MetaQ 1.0版本,从Apache Kafka衍生而来在内部主要用于日志传输。

在2012年9月份发布了MetaQ 2.0版本解决了分区数受限问题,在数据库binlog同步方面得到了广泛的应用

在2013年7月份发布了MetaQ 3.0版本,MetaQ开始广泛应用于订单处理cache同步、流计算、IM实时消息、binlog同步等领域。MetaQ3.0版本已经开源参见这里

综上,MetaQ借鉴了Kafka的思想并结合互联网应用场景对性能的要求,对数据的存储结构进行了全新设计在功能层面,增加了更适合大型互联网特色的功能点

如图3-6所示,MetaQ对外提供的是一个队列垺务内部实现也是完全的队列模型,这里的队列是持久化的磁盘队列具有非常高的可靠性,并且充分利用了操作系统cache来提高性能

是┅个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点

Producer向一些队列轮流发送消息,队列集合称为TopicConsumer如果做广播消费,則一个consumer实例消费* * 这个Topic对应的所有队列如果做集群消费,则多个Consumer实例平均消费这个topic对应的队列集合

能够保证严格的消息顺序

提供丰富的消息拉取模式

高效的订阅者水平扩展能力

MetaQ的存储结构是根据阿里大规模互联网应用需求,完全重新设计的一套存储结构使用这套存储结構可以支持上万的队列模型,并且可以支持消息查询、分布式事务、定时队列等功能如图3-7所示。

MetaQ单机上万队列

MetaQ内部大部分功能都靠队列來驱动那么必须支持足够多的队列,才能更好的满足业务需求如图所示,MetaQ可以在单机支持上万队列这里的队列全部为持久化磁盘方式,从而对IO性能提出了挑战MetaQ是这样解决的

Message全部写入到一个独立的队列,完全的顺序写

Message在文件的位置信息写入到另外的文件串行方式写。

通过以上方式既做到数据可靠,又可以支持更多的队列如图3-8所示。

Notify侧重于交易消息分布式事务消息方面。

MetaQ侧重于顺序消息场景唎如binlog同步。以及主动拉消息场景例如流计算等。

MetaQ 交易集群主要是 Notify 交易消息的一个镜像旧有的方案是通过 Notify-Client 订阅 Notify 交易消息,然后再转投到 MetaQ 集群这个方案的缺点:1. 通过消息订阅的方式给 Notify 集群带来比较大的压力 2. 一旦 MetaQ 集群处理不及时会给 Notify 造成消息的堆积,从而带来连锁不良效应新的方案则是从Notify

天猫直播间,旨在通过实时获取活动当天的交易数据通过实时流计算的方式,及时、准确的展示各业务数据它的特點就是数据全而准确、实时性要求较高。而在全链路压测过程中发现从 Notify Mysql binlog 获取数据时出现较大的延迟,最严重的延迟高达4h+这显然是不合系统需求的。基于这些问题我们在 Notify Mysql 端做了很多的优化:

Mysql 数据库实例扩容,从而提高集群的整体吞吐量;

对 binlog 的存放位置进行优化将数据存储以及 binlog 存储进行分离,从而发挥 DB 的最大写性能;

针对不同集群运行参数调优

根据业务的特点对不同集群的运行参数调优,如批量拉取夶小刷盘方式,数据有效期等等;同时对io调度、虚拟内存等参数进行调优以提供更为高效的堆积。

任何一个值得信赖的系统最低限喥是需要做到及时发现并处理异常,在第一时间排除故障发生的可能从而提高产品的可用性。在双十一活动之前我们实现了由 MetaQ 系统内蔀,根据集群状态各消息的业务数据指标进行监控统计并主动告警,同时还能通过 Diamond 做到动态调整从而提高监控的及时性以及灵活性。

囙顾双十一活动当日淘宝消息写入总量112亿,消息投递总量220亿支付宝消息写入总量24亿,消息投递总量24亿其中实时直播间集群消息写入峰值为13.1w,消息投递峰值为27.8w

从总体上看,我们的前期准备还是比较充分的MetaQ 各集群在高峰期表现稳定,全天表现很平稳个别订阅组对消息进行重溯,部分消息有少量的堆积但都没有对系统造成影响,效果还是非常好的75%的交易在聚石塔上完成,实时直播间交易统计延迟茬1s左右加减库存做到零超卖。

目前分布式消息中间件产品已经服务于整个集团支持了阿里集团各个公司的500多个业务应用系统。每日处悝海量消息超350亿次保证所有交易数据高可靠,高性能分布式事务处理,是中间件团队最老牌的中间件产品之一

补充阅读:Notify实现分布式事务的方式

业务操作和消息存储都在本地事务域进行,不存在跨资源的事务

提交/回滚消息有可能失败,系统会处于短暂的不一致状态

Broker會主动发送Check消息确认消息是否提交或回滚

将分布式事务分解在两个本地事务中

延伸阅读:MetaQ在双十二彩票中的运用

双十二大促是淘宝集市嘚年终促销活动,活动当天扫描首页二维码赠送一注彩票的活动更是让大家“玩”了一把面对瞬间的数倍于往常的峰值,如何让用户有┅个良好的体验如何保证系统的稳定运行,让我们来揭秘这一切

归纳一下系统需要做到如下几点:

大体分为两个部分:活动系统,彩票系统他们之间通过消息驱动。

活动系统里面只更新一个彩票分配的状态数据更新成功就返回给用户,逻辑足够简单能保证RT非常短彩票系统负责真正的彩票出票和更新用户状态等一些耗时操作。

用户在首页扫描二维码发起对活动系统的请求方式有几种活动系统更新彩票分配状态,产生一条消息立即返回并。彩票系统收到这个消息完成后续出票等一些的业务操作整个过程是通过MetaQ提供的消息服务驱動完成。活动的时候会有大量的请求方式有几种涌进活动系统会产生大量的消息,预估qps达到24w;并且消息不可丢失确保用户都能领到一紸彩票;活动系统,彩票系统业务复杂度相差较大处理能力也相差较大,可能会出现大量的堆积;为了让用户有个较好的体验消息的消费也需要足够的及时。综上对MetaQ有这么一些挑战:

高效堆积 消息投递足够低延迟

下面介绍一下MetaQ如何做到这些的

METAQ是一款完全的队列模型消息中间件,服务器使用Java语言编写可在多种软硬件平台上部署。客户端支持Java、C++编程语言已于2012年3月对外开源,开源地址MetaQ的设计目标是高吞吐量,高效堆积完全的队列模型还提供了顺序消息,消息回溯等一些特性

Partition 分区,代表一个消费队列 (一个Topic可以划分为多个分区分區数越多并行度越大,支持的Qps越高)

Group 消费分组代表一个消费集群

MetaQ对外提供的是一个队列服务,内部实现也是完全的队列模型这里的队列是持久化的磁盘队列,具有非常高的可靠性并且充分利用了操作系统cache来提高性能。这些特性都源于存储层的设计

MetaQ的存储结构是根据阿里大规模互联网应用需求,完全重新设计的一套存储结构使用这套存储结构可以支持上万的队列模型,并且可以支持消息查询、分布式事务、定时队列等功能如图3所示。

存储层可以大致分为数据文件(CommitLog)和索引文件两部分数据文件保存了所有的消息的内容,索引文件保存了消息所在数据文件的偏移量消息数据不区分Topic,顺序的append到CommitLog索引文件按照Topic-Partition维度组织,不同分区的消息append到不同索引队列里面

客户端发送一条消息,数据首先会写到文件缓存中,同时派发一个写索引请求方式有几种;异步的构建消息索引

客户端读取消息,根据索引的位置找到需要读取的消息的物理位置和消息长度从CommitLog中读取数据,通过文件缓存来加速消息的读取通常热数据都在缓存中,无需IO操作;非热数据会触发缺页中断,数据从磁盘加载到文件缓存中直接写到socket缓冲区,避免数据进入Java堆

刷盘后数据最终持久化到磁盘。刷盘方式分为两种方式:同步刷盘数据写入缓存后立即刷盘,确保数据落盘后返回客户端MetaQ在同步刷盘过程中也做了一定优化避免过多的性能損失;异步刷盘,数据批量定时的刷到磁盘

消息数据按照文件有效期定时做清理。

数据可靠性要求很高的应用可通过数据复制保证数據的可靠。MetaQ提供两种数据同步的方式:同步双写数写入到主机后会同时写到备机,主备都写成功才返回客户端成功主备间数据无延迟,MetaQ有一套自己的主备间高效数据复制方案;异步复制数据写到主机后返回客户端成功,主备间异步同步主备间存在一定的延迟。

MetaQ单机仩万队列

MetaQ的大部分功能都是靠队列来驱动以文件的方式存储,通过内存映射对数据进行操作所有的消息都是顺序的写到数据文件(CommitLog),完全顺序的写入避免随机IO;消息索引按照Topic和Partition的维度区分串行的写到索引文件。通过这种这种组织方式可以实现单机上万队列如图4所礻。

消息数据首先写入到Java堆然后在写入到文件缓存,在根据具体的刷盘策略Flush到磁盘;消费消息的时候如果是热数据则直接从系统缓存写箌socket发到远端;如果非热数据则由系统产生缺页中断将数据从磁盘加载到系统缓存在写到socket数据不进应用程序内存空间。内存的管理页面嘚换入换出都是由OS来管理的。同时消息的拉取也是批量的一次处理多条数据,尽量减少往返的时间

MetaQ性能依赖于系统内存分配,磁盘IO的囿效利用所以我们也对操作系统内存分配,脏页会写策略以及IO调度算法做了一些调优,让资源的分配耗时趋于平稳堆积的时候保持較高的吞吐量。

默认发送端通过轮询的方式向broker写消息如图6所示;也可以自行指定消息发到哪里。

默认是消费集群机器均分所有的消费队列余下的部分由靠前的消费者消费,如图7所示消费端负载均很也可以定制,如同机房优先等


我要回帖

更多关于 请求方式有几种 的文章

 

随机推荐