开发者

环信CTO:互联网高并发技术方案选型思考和实践?

本文通过逐步的技术分析,从共享我们在网络高并发技术方案选择上的思考和决策的技术选择高度,为设计者在面对高并发业务设计时应考虑的各个方面作出参考。

Beautifulconcurencyamp的Prettyerlang

前言

环信以连接人和人、连接人和商业为使命,为许多企业开发人员提供最高质量的全球即时通信PaaS服务如何实现高并发场景,灵活的保障服务质量是我们一贯的业务要求和技术追求。

本文通过逐步的技术分析,在网络高并发技术方案术方案选择上的思考和决策共享的技术选择高度,为设计者面对高并发业务设计时应考虑的各个方面作出参考。

接下来,enjoy:

BeautifulConcyndash的必要性

世界并发,软件也应该并发

我们生活在其中的世界是巨大的并发系统。总是在世界的每个角落,人类的每个个人都在与这个世界频繁的能量交流,信息交流也是其重要的组成部分,当我们转换身份,从创造者的角度俯瞰这个世界的所有东西(动物、植物、海洋、土壤、机器等)时,也可以看到和这个世界一样的能量/信息交流

为了与这个世界有效的互动,软件也应该并发。

世界是分布式的,软件也应该是分布式的

地球是圆的,世界是平的,无论如何,从宇宙大爆炸的奇点,就是分布式的宇宙/世界。作为一款与世界万物(含人类自身)互动的软件,自然也要符合分布式的要求。而这种地理分布(Geo. Distribution)特性,也仅是并发在空间维度下的反映而已。

世界不可预测,软件也应该是容错的

没有完美的世界:冲突,灾难随时在发生,不管在什么样的维度上。作为软件,bug,crash也是不可规避的现实挑战。即使存在完美的没有bug的程序,运行程序的硬件也可能出现故障。为了提高软件的容错性,代码的独立性(指故障不会影响故障任务以外的任务)和故障检查和故障处理很重要。这一切都需要并发。因为串行程序的容错性远远不及并发程序。

并发方案概要

7个模型来源于Paulbutcher着作的《SevencurencyModels廓inSeven剪切Weeeks》,中文译名《七星期七并发模型》,概要介绍并发领域的常见方案,希望能设计者提供轮化的分类说明。本人在此基础上追加了自己的开拓思考(参照以下斜体部分):

1.线程和锁定:线程和锁定模型有很多众所周知的不足,但仍是其他模型的技术基础,也是很多并发软件开发的优先事项。这个方案其实是anti-pattern,在高并发场景下像薄冰一样,让开发者和运输人员大胆地惊讶。UglyLockstougly。Concurency(丑陋的锁,丑陋的并发:locksanditionvariablesisfundamentallyflawed!

2.函数式编程:函数式编程日渐重要的原因之一,是其对并发编程和并行编程提供了良好的支持。函数式编程消除了可变状态,所以从根本上是线程安全的,而且易于并行执行。函数之美,逻辑之美!相信很多从命令式语言(Imperative Programming)转战到函数式编程语言(Functional Programminmg)的时候都会发出这样的感叹。事实上,这一进步反映了人类在不断进化的过程中对世界的认知不断提炼,思维模式逐渐从具体到抽象的进化轨迹。回到高并发的话题,函数编程以不变状态的简单战略,获得了完美的赞扬,简直就是君临天下的明天霸主!

3.分离标志和状态:如果一个行程引用持续的数据结构,其他行程对数据结构的修改是看不见的。因此持久数据结构对并发编程的意义非比寻 常,其分离了标识(identity)与状态(state)。这又是一个很棒的战略,众所周知的versioncontrolsystem如git,包括比特币/块链在内的机制是这个思想指导下的具体实践,限于篇幅,本文不再展开。

4.ActorModel:适用性广的并发编程模型,适用于共享存储模型和分布存储模型,也适用于解决地理分布问题,提供强大的容错性。最初接触Actor模型是通过Erlang语言,然后接触Akka(基于Scala)等基于各种语言实现的框架,越来越感受到该模型在高并发场景下的游戏。本文的后续部分将进行介绍。另外,做招聘广告,环信云开发团队广纳英才,欢迎了解Erlang,有高并发开发经验的伙伴加盟,虚位等待!请在这里直接联系我哦

5.CSP:表面上,CSP模型与ActordModel相似,两者都是基于信息传递的。不过CSP模型侧重于传递信息的通道,而Actor Model侧重于通道两端的实体,使用CSP模型的代码会带有明显不同的风格。这里是channel可以打拳的天地,googo,go!限于篇幅,本文不再展开。同样,欢迎了解谷歌,有高并发开发经验的合作伙伴加盟,虚位等待!

6.数据级并行:每台笔记本电脑都隐藏着超级计算机GPU。GPU利用数据级并行,不仅可以快速进行图像处理,还可以用于更广阔的领域。如果要进行有限元分析、流体力学计算或其他大量数字计算,GPU的性能将是择。在过去的两年里,中国人的光芒、黄仁勋(JensenHuang、CEOofNvidia)一次又一次地从家里的壁炉里带来了震撼世界的创新产品,把以前不能攀登的GPU飞到普通人的家里,一次又一次地带来了计算力的争论。相信在不久的将来,有了GPU算力加持和人工智能算法的普惠使用,会有无数的AI应用层出不穷的涌现,它们会从云端落地到边缘,人类可能会比自己想象的更早的进入前途未卜的人机争霸时代。

7.Lambda架构:Lambda架构综合了MapReduce和流式处理的特点,是一种可以处理多种大数据问题的架构。 Lambda架构也是采用了数据并行处理技术,但是它把并行算力的微观场景放大到了一个更大的尺度:将数据和计算分布到成千上万台机器组成的集群上进行,将并发,分布特性整合到一套方案中,通过两层(批处理层-Batch Layer,加速层-Speed Layer/Streaming Process)的组合,实现了高计算效率和低延迟的鱼与熊掌兼得。

Prettyerlang

环信的世界即时通信云的核心网络是基于Erlang/OTP开发的,迄今为止服务了数十万APP客户,单集群日新闻数十亿级积累多年经验,我们不断优化系统,榨取计算,网络等资源内生价值,挑战系统不断提高的指标要求。感谢Erlang/OTP,有了它,我们像站在了巨人肩膀上的一名挥舞利刃的勇士,能够从容应对各种黑云压城城欲摧的业务压力和不断变化,五花八门的业务需求。以下,我们简单总结了Erlang/OTP几点让我们迷醉的特质,给想入坑的小伙伴以参考:

Let it Crash!

再一次,让我们理解了思维高度决定人生高度。其他语言和解决方案的防御性,想办法捕获异常/错误,尽最大努力恢复失败时,Erlang采用Letitcrash!由于战略着重于错误的检查和错误的通知系统,通过严格设计的单向、双向link机制,OTP基于该设计的supervisorbehaviour级别管理报告机制,在崩溃的同时清洁美丽地将所有的Actor(过程)在发生异常时的行为进行了简单有效的管理,得到了意想不到的好处:

代码简洁易懂,只要关心崩溃的级别就有容易错误的代码

由于Actortortortor设计的记录,所以不仅可以相互通知Actortorto的管理状态这个战略在后续的PatternMatching中也可以看到。我们可以在_Other(所有匹配都没有触发)保护匹配中记录相应的信息,不必为预测不到的场景绞尽脑汁!

ActorModel

ActorModel是Pureoo的设计(Java类和方法的设计不是意外的中所述情节,对概念设计中的量体体积进行分析:每个Actor都被封装,外部没有任何方法来控制对象。他们只能通过发送消息通知Actor,Actor自己控制消息的处理。这种简化也为高并发处理提供了意想不到的强有力的支持。

Actor Model适用于共享内存模型和分布式内存模型,也适合解决地理分布型问题,能提供强大的容错性,用了都说好!

我个人在曾经的工作中做过一个网络安全过滤的产品,是靠自己团队设计编写的一套消息队列处理机制来解耦不同业务对相同数据的处理,后来回想起来才蓦然发现其实这就是个简陋的Actor Model设计,只是那个时候还不知道Erlang/OTP,要是早用上这把利器,能节省我生命中多少个日日夜夜啊!

关于函数编程的书籍介绍,资料已经很多,本文不怎么展开。简单列举个人经验:

程序最终必须交给机械处理,因此尽量按照机械的思考模式制作程序,程序员的头大,最简单的(aab)和(atab):前者对人类友好,后者对机械友好,因此可以带来更好的程序一致性,系统可以设计的更简单

命令式程序的代码由一系列改变整体状态的语言构成,函数式程序由计算过程抽象成表达式的要求值。这些表达式由纯数学函数组成,而这些数学函数是第一类目的(我们可以像操作数值一样操作第一类目的),没有副作用。由于没有副作用,函数编程更容易实现线程安全,特别适合并发/并行编程。

函数之美带来美的并发!本文摘要:

forme,autifulprogramishonethathisthanthathath成为itobviouslyhashonthistakes、ratherthanthantakes、ratherthanthavinobthinthanthanthanthererthanthinghthanthanthanthobobothathisth成为首选。IffwanthanthanthisthanthathathatataththtantiststakesthontisthonthontisthontisthontististhonthontisthonthontististantantisthonthonthonthontisthonthonthontistanthanthantantanthesthonthontantanthanthonthonthonthathatantantistististhathatathatatatatathesthantististantistantantistantisthontinthestantherantantantantantintatatantantellllllestantintantantantelelelestantantantantantantheshelelelelestheststhestantanthPattern,Matching发挥效果的不仅开发者_如何学Python仅是case/if,你的代码整体在PatternMatching的魔力下发挥优雅的魅力。

对高并发的不懈追求一直是环信云开发团队的目标,我们也期待着在这个险峻的山路上不断攀登,厚积薄发,给环信客户带来一贯的终极产品体验

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜