0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ServiceComb的通信处理详解

华为开发者社区 来源:未知 作者:李倩 2018-05-15 09:39 次阅读

今天的介绍ServiceComb的通信处理详解。

整体介绍

ServiceComb的底层通信框架依赖Vert.x. vertx标准工作模式为高性能的Reactive模式,其工作方式如下图所示:

图 Reactive模式工作方式

业务逻辑直接在Eventloop中执行,整个业务流程中没有线程切换,所有的等待逻辑都是异步的,只要有任务,则不会让线程停下来,充分、有效地利用系统资源。

vertx生态中包含了业界常用各种组件的Reactive封装,包括jdbc、zookeeper、各种mq等等。但是Reactive模式对业务的要求相当高,业务主流程中不允许有任何的阻塞行为。因此,为了简化上层业务逻辑,方便开发人员的使用,在Vertx之上提供同步模式的开发接口还是必不可少的,例如:

各种安全加固的组件,只提供了同步工作模式,比如redis、zookeeper等等;

一些存量代码工作于同步模式,需要低成本迁移;

开发人员技能不足以控制Reactive逻辑。

所以ServiceComb底层基于vertx,但在vertx之上进行了进一步封装,同时支持Reactive及同步模式。

工作于Reactive模式时,利用Vertx原生的能力,不必做什么额外的优化,仅需要注意不要在业务代码中阻塞整个进程。

而同步模式则会遭遇各种并发性能问题。,本文描述同步模式下的各种问题以及解决方案。

RESTful流程中,连接由vertx管理,当前没有特别的优化,所以本文中,连接都是指highway流程中的tcp连接。

同步模式下的整体线程模型

图 同步模式下的整体线程模型

一个微服务进程中,为transport创建了一个独立的vertx实例;

Eventloop是vertx中的网络、任务线程;

一个vertx实例默认的Eventloop数为:

2 * Runtime.getRuntime().availableProcessors()

服务消费者端

在服务消费者端,主要需要处理的问题是如何更加高效地把请求推送到服务提供者上去,然后拿到服务提供者的返回信息。所以在这一端我们主要关注“如何更高效的发送数据”这个话题

单连接模型

1、最简单的单连接模型

图 最简单的单连接模型

从模型图中,我们可以看到,所有的consumer线程,如果向同一个目标发送数据,必然产生资源竞争,此时实际的处理如下:

Connection.send内部直接调用Vertx的socket.write(buf),是必然加锁互斥的。

这必然导致大量并发时,大多数consumer线程都无法及时地发送自己的数据。

Socket.write内部会调用netty的channel.write,此时会判断出执行线程不是Eventloop线程,所以会创建出一个任务并加入到Eventloop任务队列中,如果Eventloop线程当前在睡眠态,则立即唤醒Eventloop线程,异步执行任务。

这导致频繁的任务下发及线程唤醒,无谓地增加cpu占用,降低性能。

2、优化的单连接模型

图 优化的单连接模型

在优化模型中:

每个TcpClientConnection额外配备一个CAS消息队列;

Connection.send不再直接调用vertx的write方法,而是:

所有消息保存到CAS队列中,减少入队竞争;

通过原子变量判定,只有入队前CAS队列为空,才向Eventloop下发write任务,唤醒Eventloop线程;

在Eventloop中处理write任务时,将多个请求数据包装为composite buffer,批量发送,减少进入os内核的次数,提高tcp发送效率。

代码参见:

https://github.com/ServiceComb/ServiceComb-Java-Chassis/blob/master/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/client/tcp/TcpClientConnection.java

io.servicecomb.foundation.vertx.client.tcp.TcpClientConnection.packageQueueio.servicecomb.foundation.vertx.client.tcp.TcpClientConnection.send(AbstractTcpClientPackage, long, TcpResponseCallback)

https://github.com/ServiceComb/ServiceComb-Java-Chassis/blob/master/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/tcp/TcpConnection.java

io.servicecomb.foundation.vertx.tcp.TcpConnection.write(ByteBuf)

io.servicecomb.foundation.vertx.tcp.TcpConnection.writeInContext()

进行此项优化后,在同一环境下测试2组数据,可以看到性能有明显提升(不同硬件的测试环境,数据可能差异巨大,不具备比较意义):

TPS Latency(ms) CPU TPS提升比例 时延提升比例
Consumer Producer (新-旧)/旧 (旧-新)/新
优化前 81986 1.22 290% 290% 77.31% 43.61%
优化后 145369 0.688 270% 270%

表:单连接模型优化前后性能对比

多连接模型

在单连接场景下进行相应的优化后,我们发现其实还有更多的优化空间。因为在大多数场景中,实际机器配置足够高,比如多核、万兆网络连接、网卡支持RSS特性等。此时,需要允许一对consumer与producer之间建立多条连接来充分发挥硬件的性能。

图 多连接模型

允许配置多个Eventloop线程

在microservice.yaml中进行以下配置:

cse:

highway:

client:

thread-count: 线程数

server:

thread-count: 线程数

Consumer线程与Eventloop线程建立均衡的绑定关系,进一步降低consumer线程的竞争概率。

代码参见:

https://github.com/ServiceComb/ServiceComb-Java-Chassis/blob/master/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/client/ClientPoolManager.java

io.servicecomb.foundation.vertx.client.ClientPoolManager.findThreadBindClientPool()

优化后的性能对比:

TPS Latency
(ms)
CPU TPS提升比例 时延提升比例
Consumer Producer (新-旧)/旧 (旧-新)/新
简单单连接*10 543442 0.919 2305% 1766% 72.81% 42.11%
CAS单连接*10 939117 0.532 1960% 1758%

表 多连接下线程模型优化前后性能对比

每请求大小为1KB,可以看到万兆网的带宽接近吃满了,可以充分利用硬件性能。

(该测试环境,网卡支持RSS特性。)

服务提供者端

不同于服务消费者,服务提供者主要的工作模式就是等待消费者的请求,然后处理后返回应答的信息。所以在这一端,我们更加关注“如何高效的接收和处理数据”这件事情。

同步模式下,业务逻辑和IO逻辑分开,且根据“隔离仓”原则,为了保证整个系统更加稳定和高效地运行,业务逻辑本身也需要在不同隔离的区域内运行。而这些区域,就是线程池。所以构建服务提供者,就需要对线程池进行精细的管理。

下面是针对线程池的各种管理方式。

1、单线程池(ThreadPoolExecutor)

下图表示的是将业务逻辑用单独的线程池实现的方式。在这种方式下,IO仍然采用异步模式,所有接到的请求放入队列中等待处理。在同一个线程池内的线程消费这个队列并进行业务处理。

图 单线程池实现方式

在这种方式下,有以下瓶颈点:

所有的Eventloop向同一个Blocking Queue中提交任务;

线程池中所有线程从同一个Blocking Queue中抢任务执行;

ServiceComb默认不使用这种线程池。

2、多线程池(ThreadPoolExecutor)

为规避线程池中Queue带来的瓶颈点,我们可以使用一个Executor将多个真正的Executor包起来。

图 多线程池实现方式

Eventloop线程与线程池建立均衡的绑定关系,降低锁冲突概率;

相当于将线程分组,不同线程从不同Queue中抢任务,降低冲突概率。

ServiceComb默认所有请求使用同一个线程池实例:

io.servicecomb.core.executor.FixedThreadExecutor

FixedThreadExecutor内部默认创建2个真正的线程池,每个池中有CPU数目的线程,可以通过配置修改默认值:

servicecomb:

executor:

default:

group: 内部真正线程池的数目

thread-per-group: 每个线程池中的线程数

代码参见:

https://github.com/ServiceComb/ServiceComb-Java-Chassis/blob/master/core/src/main/java/io/servicecomb/core/executor/FixedThreadExecutor.java

3、隔离仓

业务接口的处理速度有快有慢,如果所有的请求统一在同一个Executor中进行处理,则可能每个线程都在处理慢速请求,导致其他请求在Queue中排队。

此时,可以根据业务特征,事先做好规划,将不同的业务处理按照一定的方式进行分组,每个组用不同的线程池,以达到隔离的目的。

图 隔离仓

隔离仓的实现依托到ServiceComb灵活的线程池策略,具体在下一节进行描述。

4、灵活的线程池策略

ServiceComb微服务的概念模型如下:

图 ServiceComb微服务概念模型

可以针对这3个层次进行线程池的配置,operation与线程池之间的对应关系,在启动阶段既完成绑定。

operation与线程池之间的绑定按以下逻辑进行:

查看配置项cse.executors.Provider.[schemaId].[operationId]是否有值;

如果有值,则将值作为beanId从spring中获取bean实例,该实例即是一个Executor。

如果没有值,则继续尝试下一步:

使用相同的方式,查看配置项cse.executors.Provider.[schemaId]是否有值;

使用相同的方式,查看配置项cse.executors.default是否有值;

以”cse.executor.groupThreadPool”作为beanId,获取线程池(系统内置的FixedThreadExecutor)。

代码参见:

https://github.com/ServiceComb/ServiceComb-Java-Chassis/blob/master/core/src/main/java/io/servicecomb/core/executor/ExecutorManager.java

按以上策略,用户如果需要创建自定义的线程池,需要按以下步骤执行:

实现java.util.concurrent.Executor接口

将实现类定义为一个bean;

在microservice.yaml中将线程池与对应的业务进行绑定。

5、线程池模型总结

如上一节所述,在默认多线程池的基础上,CSE提供了更为灵活的线程池配置。“隔离仓”模式的核心价值是实现不同业务之间的相互隔离,从而让一个业务的故障不要影响其他业务。这一点在CSE中可以通过对线程池的配置实现。例如,可以为不同的operation配置各自独立的线程池。

另外,灵活性也带来了一定的危险性。要避免将线程池配置为前面提到的“单业务线程池”模式,从而为整个系统引入瓶颈点。

写在最后:ServiceComb除了在华为云微服务引擎商用之外,也于2017年12月全票通过进入Apache孵化器。欢迎感兴趣的读者前往开源社区和我们讨论切磋,希望此文可以给正在进行微服务方案实施的读者们一些启发。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 华为
    +关注

    关注

    215

    文章

    33442

    浏览量

    246698
  • 无线通信
    +关注

    关注

    56

    文章

    4149

    浏览量

    142041
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1253

    浏览量

    78192

原文标题:微服务|打造企业级微服务开发框架(下)

文章出处:【微信号:Huawei_Developer,微信公众号:华为开发者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    飞思卡尔QorIQ通信处理器内部架构详解

    飞思卡尔半导体QorIQ通信处理器多年来一直作为业界通信处理器的主力军,为应对信息大爆炸和物联网的发展,QorIQ也在不断革新。本文详解QorIQ T1040和T1042通信处理器内部
    发表于 11-26 10:13 3794次阅读
    飞思卡尔QorIQ<b class='flag-5'>通信处理</b>器内部架构<b class='flag-5'>详解</b>

    什么是飞思卡尔运筹帷幄细化QorIQ通信处理器?

    从模拟制式手机到2G、3G、4G甚至是未来的5G,每到转折期就有一些人被技术牵绊而不知何去何从,飞思卡尔半导体总是能应景推出相应的通信处理器等创新产品,为通信时代的跨越保驾护航。在物联网时代,通信处理
    发表于 07-30 06:47

    飞思卡尔LS1系列通信处理器迎来了哪些机遇?

    甚至互联网公司都推出了极富竞争力的智能路由器,而物联网时代必将有更多五花八门的智能设备孕育而生,这都离不开强大的智能芯片作为技术支撑,特别是通信处理器。集成的诱惑。可以说从计算机发明开始,人类就在谋求
    发表于 07-31 07:38

    苏州求购CP443-1通信处理器卡件/回收西门子通信处理

    苏州上门大量求购全新CP443-1通信处理器卡件/回收西门子通信处理器、6GK7 243-2AX01-0XA0、6GK7 443-1EX30-0XE0、6GK7 343-1GX30-0XE0
    发表于 06-12 20:47

    串口通信处理数据的思路是什么

    串口通信处理数据的思路是什么
    发表于 02-18 07:52

    QorIQ通信处理器飞思卡尔

    QorIQ 通信处理器飞思卡尔 飞思卡尔半导体推出第一款基于其QorIQ 通信平台,并且融入 QUICC Engine多协议技术的处理器。QorIQ P1012/P1021 产品系列为使用
    发表于 12-09 09:38 659次阅读

    LSI推出的最新Axxia通信处理

    LSI推出的最新Axxia通信处理器 LSI 公司日前宣布推出专为无线基础设施应用设计的 Axxia™ 系列通信处理器。Axxia 通信处理器采用突破性 LSI™ Virtual Pipeline
    发表于 02-22 10:19 846次阅读

    LSI推出Axxia 系列通信处理

    LSI推出Axxia 系列通信处理器 LSI 公司宣布推出专为无线基础设施应用设计的 Axxia 系列通信处理器。Axxia 通信处理器采用突破性 LSI™ Virtual Pipeline™ 消息传递
    发表于 02-23 09:30 894次阅读

    LSI推出无需外部存储器的多核通信处理器APP3100

    LSI推出无需外部存储器的多核通信处理器APP3100 LSI公司日前宣布面向企业及服务提供商推出LSI APP3100多核通信处理器。LSI APP3100基于获奖的LSI APP3300通信处理器之上,能够为
    发表于 04-27 10:08 527次阅读

    XLP8128S多核通信处理器解决方案

      NetLogic Microsystems,宣布推出创新的XLP8128S多核通信处理器解决方案。该方案集成了128个nxCPUs和160个以上可编程处理引擎,可为下一代3G/4G移动无线基础设施、企业、存储、安全
    发表于 09-11 09:10 656次阅读

    TranSwitch最新Atlanta 2000通信处理器能力超群

    TranSwitch(传威)公司最新推出的Atlanta 2000通信处理器计算性能登上业界最高峰,可同时处理一千个语音和数据通道,且总的功率损耗只有3W,也即每通道功耗只有3mW
    发表于 03-25 09:33 1031次阅读

    飞思卡尔通信处理器领导通信网络市场

    飞思卡尔半导体在1989年推出业界首款多协议微处理器,确立了通信处理器市场之后,长期位居这一市场的领导地位,其产品线的覆盖广度及深度均鲜有竞争者企及。
    发表于 08-31 09:25 831次阅读

    通信处理器的新能如何

    C-Port的C-5数字通信处理器(DCP)面向各种通信应用 - 从高功能以太网交换机和多业务接入平台到太比特路由器和光边缘交换机。凭借其通用和通信专用处理能力,C-5取代了制造商通常
    的头像 发表于 08-13 16:04 2297次阅读

    QorIQ通信处理器的详细介绍

    从模拟制式手机到2G、3G、4G甚至是未来的5G,每到转折期就有一些人被技术牵绊而不知何去何从,飞思卡尔半导体总是能应景推出相应的通信处理器等创新产品,为通信时代的跨越保驾护航。在物联网时代,通信处理
    发表于 09-29 10:44 0次下载
    QorIQ<b class='flag-5'>通信处理</b>器的详细介绍

    PROFIBUS通信处理器功能的介绍

    PROFIBUS通信处理器(CP)用于将SIMATIC plc连接到PROFIBUS网络,可以提供S7通信、S5兼容通信(FDL)和PG/OP(编程器/操作员面板)通信,实现SYNC/
    发表于 12-15 10:37 753次阅读