登录  | 加入社区

黑狼游客您好!登录后享受更多精彩

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 858|回复: 0

环信CTO:互联网高并发技能方案选型思索和实践

[复制链接]

960

主题

960

帖子

0

现金

黑狼菜鸟

Rank: 1

积分
0
发表于 2020-12-24 03:15:16 | 显示全部楼层 |阅读模式 来自 安徽合肥

原标题:环信CTO:互联网高并发技能方案选型思索和实践

C1d22GgdOU2gLZtd.jpg

本文试图通过渐进的技能分析,和各人分享我们在互联网高并发技能方案选择上的一些思索和决议;从技能选型的高度为架构师在面临高并发业务计划时必要思量的方方面面做一个参考。

Beautiful Concurrency & Pretty Erlang

媒介

环信以“毗连人与人,毗连人与贸易”为任务,旨在为广大企业开辟者提供最优质的环球即时通讯PaaS服务。怎样实现高并发场景下,弹性化的保障服务质量是我们一向的业务要求和技能寻求。

本文试图通过渐进的技能分析,和各人分享我们在互联网高并发技能方案选择上的一些思索和决议;从技能选型的高度为架构师在面临高并发业务计划时必要思量的方方面面做一个参考。

接下来,enjoy:

Beautiful Concurrency – 并发的须要性

天下是并发的,软件也应该是并发的

我们生存在此中的天下,就是一个巨大的并发体系。时时刻刻,在天下的每一个角落,人类的每一个个体都在和这个天下举行着频仍的能量交互,信息交互也是此中的紧张构成部门;当我们转换身份,以造物主的视角俯瞰这个天下里全部的万物(动物,植物,海洋,泥土,呆板等等)时,也可以看到它们同样在和这个天下举行着无休止的能量/信息交互。

为了与这个天下举行有用的交互,软件也应该是并发的。

天下是分布的,软件也应该是分布的

地球是圆的,天下是平的,不管怎样,从宇宙大爆炸的谁人奇点之后,就是分布的宇宙/天下。作为与天下万物(包罗人类本身)交互的软件,天然也必须满意分布式要求。而这种地理分布(Geo. Distribution)特性,也仅是并发在空间维度下的反映而已。

睁开全文

天下不可猜测,软件也应该是容错的

没有完善的天下:辩论,劫难随时在发生,不管在什么样的维度上。作为软件,bug,crash也是不可规避的实际挑衅。纵然存在完善的没有bug的步伐,运行步伐的硬件也大概出现故障。为了加强软件的容错性,代码的独立性(指一个故障不会影响到故障使命以外的别的使命)和故障检测以及故障处置惩罚是关键:这统统都必要并发,由于串行步伐的容错性远远不如并发步伐。

并发方案概览

“七个模子”泉源于Paul Butcher著的《Seven Concurrency Models in Seven Weeks》,中文译名《七周七并发模子》,概览的先容了并发范畴的常见方案,盼望能给架构师提供一个表面化的分类形貌。本人在其底子上添加了一些本身的拓展思索(见下文中斜体部门):

1.线程与锁:线程与锁模子有许多众所周知的不敷,但还是其他模子的技能底子,也是许多并发软件开辟的首选。—这个方案实在是一个anti-pattern,在高并发场景下如履薄冰(bug,dead lock跬步不离),让开辟者和运维职员提心吊胆。Ugly Locks to Ugly Concurrency (貌寝的锁,貌寝的并发):locks and condition variables is fundamentally flawed!

2.函数式编程:函数式编程日渐紧张的缘故原由之一,是其对并发编程和并行编程提供了精良的支持。函数式编程消除了可变状态,以是从根本上是线程安全的,而且易于并行实行。— 函数之美,逻辑之美!信赖许多从下令式语言(Imperative Programming)转战到函数式编程语言(Functional Programminmg)的时间都会发出如许的感叹。实在这一进步恰好表现了人类在不停的进化过程中,对这个天下认知不停提炼,头脑模式渐渐由具象走向抽象的演进轨迹。而回到高并发的话题上,函数式编程以不可变状态这一浅易的计谋,赢得了完善赞誉,俨然已是君临天下的嫡霸主!

3.分离标识与状态:假如一个线程引用了长期数据布局,那么其他线程对数据布局的修改对该线程就是不可见的。因此长期数据布局对并发编程的意义非比寻 常,其分离了标识(identity)与状态(state)。— 这又是一个很妙的计谋,而各人熟知的version control system如git,包罗比特币/区块链的机制都是这一头脑引导下的详细实践,限于篇幅,本文不做进一步睁开。

4.Actor Model:一种实用性很广的并发编程模子,实用于共享内存模子和分布式内存模子,也得当办理地理分布型题目,能提供强盛的容错性。— 最开始打仗到Actor模子就是通过Erlang语言,厥后又打仗到Akka(基于Scala)等基于各种语言实现的框架,也越来越领会到这一模子在高并发场景下的游刃有余。本文后续部门会睁开先容。别的,做个雇用小广告,环信通讯云研发团队正在广纳英才,接待懂Erlang,有相干高并发开辟履历的小同伴加盟,虚位以待!点这里直接接洽我们哟!

5.CSP(Communicating Sequential Processes, CSP):外貌上看,CSP模子与Actor Model很相似,两者都基于消息通报。不外CSP模子偏重于通报信息的通道,而Actor Model偏重于通道两头的实体,利用CSP模子的代码会带有显着差别的风格。— 这里就是channel可以大施拳脚的天地了,go go go!限于篇幅,本文不做进一步睁开。同样的,接待懂Golang,有相干高并发开辟履历的小同伴加盟,虚位以待!

6.数据级并行:每个条记本电脑里都藏着一台超等盘算机——GPU。GPU使用了数据级并行,不但可以快速举行图像处置惩罚,也可以用于更 广阔的范畴。假如要举行有限元分析、流体力学盘算或其他的大量数字盘算,GPU的性能将是不二选择。— 在已往的两年里,华人之光,黄仁勋(Jensen Huang, CEO of Nvidia),从自家的壁炉里一次又一次给各人带来了震撼天下的革新产物,让之前高不可攀的GPU飞入平常百姓家,也带来了一次又一次的算力之争。信赖在不久的未来,有了GPU算力加持和人工智能算法的普惠利用,会有无数的AI应用层出不穷的涌现,它们会从云端落地到边沿,人类大概会比本身想象的更早的进入前程未卜的人机争霸期间。

7.Lambda架构:Lambda架构综合了MapReduce和流式处置惩罚的特点,是一种可以处置惩罚多种大数据题目的架构。— Lambda架构也是接纳了数据并行处置惩罚技能,但是它把并行算力的微观场景放大到了一个更大的标准:将数据和盘算分布到成千上万台呆板构成的集群上举行,将并发,分布特性整合到一套方案中,通过两层(批处置惩罚层-Batch Layer,加快层-Speed Layer/Streaming Process)的组合,实现了高盘算服从和低耽误的“鱼与熊掌兼得”。

Pretty Erlang

环信的环球即时通讯云的焦点网络是基于Erlang/OTP开辟的,停止现在共服务了几十万APP客户,单集群日消息几十亿量级并还在不停挑衅新高。多年的履历积聚,我们仍在不停的对体系举行优化,压迫盘算,网络等资源的内生代价,挑衅系同一个又一个不停提拔的指标要求。感谢Erlang/OTP,有了它,我们像站在了巨人肩膀上的一名挥动利刃的勇士,可以或许从容应对各种“黑云压城城欲摧”的业务压力和不停变革,五花八门的业务需求。以下,我们简朴总结了Erlang/OTP几点让我们“迷醉的特质”,给想入坑的小同伴以参考:

Let it Crash!

再一次,让我们明白了“头脑高度决定人生高度”。当别的语言大概办理方案防御性的,想方想法捕捉非常/错误并努力挽回“败局”的时间,Erlang采取了”Let it crash!”的计谋,把重点放在了错误的检测和错误关照体系上,通过严谨计划的单向,双向link机制,OTP基于此计划的supervisor behaviour层级(Hierarchical)管理报告机制,”任其瓦解“的同时又干净美丽的将全部Actor(历程)在发生非常时的举动举行了简朴但有用的管理,得到了意想不到的利益:

代码简便易懂,仅在必要关心瓦解处置惩罚的层级存在容错代码;

由于Actor Model的计划,Actor之间相互独立,也不共享状态,因此任何一个Actor的瓦解并不会影响别的Actor,遑论它的管理者(Supervisor),因此管理者可以从容的处置惩罚被管理Actor的瓦解;

管理者也可以不处置惩罚瓦解,仅记载相应瓦解,继而通过检察瓦解关照来举行后续处置惩罚。这个计谋在后续Pattern Matching时间还访问到,我们可以在_Other(全部匹配均未触发)掩护匹配中记载相应信息,而不必为事先预估不到的场景绞尽脑汁!

Actor Model

Actor Model是Pure OO的计划(而Java类与方法的计划并不是,意不不测?):每一个Actor封装了状态,外界并没有任何方法来利用(manipulate)对象,它们唯有通过发送消息关照Actor,由Actor本身控制对消息的处置惩罚,这种简化同样为高并发处置惩罚提供了料想之外的强盛支持。

Actor Model实用于共享内存模子和分布式内存模子,也得当办理地理分布型题目,能提供强盛的容错性,用了都说好!

我个人在曾经的工作中做过一个网络安全过滤的产物,是靠本身团队计划编写的一套消息队列处置惩罚机制来解耦差别业务对雷同数据的处置惩罚,厥后追念起来才蓦地发现实在这就是个大略的Actor Model计划,只是谁人时间还不知道Erlang/OTP,要是早用上这把利器,能节流我生掷中多少个日日夜夜啊!

Functional Programming

先容函数式编程的册本,资料已经许多了,本文不做过多的睁开。简朴枚举下个人的几点领会:

步伐终极照旧要交给呆板处置惩罚,因此要只管按照呆板的头脑模式去编写步伐(固然有时间会让步伐员头大),最简朴的 (a + b) 与 (+ a b):前者对人类友爱,而后者对呆板友爱,因而也能带来更好的步伐同等性,继而使得体系可以计划的更简朴;

下令式编程的代码由一系列改变全局状态的语句构成,而函数式编程则是将盘算过程抽象成表达式求值。这些表达式由纯数学函数构成,而这些数学函数是第一类对象(我们可以像操纵数值一样操纵第一类对象)而且没有副作用。由于没有副作用,函数式编程可以更轻易做到线程安全,因此特殊得当于并发/并行编程。

函数之美带来美之并发!原文摘抄:

For me, a beautiful program is one that is so simple and elegant that itobviously has no mistakes,rather than merely having no obvious mistakes. If we want to write parallel programs that work reliably, we must pay particular attention to beauty.

Pattern Matching

又一个让你被美折服的计划:函数在这种Pattern Matching的语法布局的形貌下,俨然酿成了一道道证实题,你只必要形貌(并不必要穷举)你所关心的场景(Conditon)下本身的想法,剩下的就交给”模式匹配“这个主动化呆板帮你完成。你大概想不到的是,”Pattern Matching“发挥功效的地方并不但是case/if出现的地方,你的整个代码都是在”Pattern Matching“的魔力下散发它优雅的魅力。

Future Evolution

对高并发的不懈寻求将不停是环信通讯云研发团队的目的,我们也等待在这条坎坷山路上不停攀缘,厚积薄发,为环信的客户带来一向的极致产物体验!返回搜狐,检察更多

责任编辑:





上一篇:Flyme9纯净体系为何不醒目掉APP开屏广告?魅族解答
下一篇:AMD将于3月16日零点召开辟布会,公布第三代EPYC霄龙处置惩罚器 ...
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

 

QQ|申请友链|小黑屋|手机版|Hlshell Inc. ( 豫ICP备16002110号-5 )

GMT+8, 2024-5-13 10:56 , Processed in 0.164918 second(s), 47 queries .

HLShell有权修改版权声明内容,如有任何爭議,HLShell將保留最終決定權!

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表