
本文试图通过渐进的技术分析,和大家 我们在互联网高并发技术方案选择上的一些思考和决策;从技术选型的高度为架构师在面对高并发业务设计时需要考虑的方方面面做一个参考。
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,有相关高并发开发经验的小伙伴加盟,虚位以待!点这里直接联系我们哟!
版权声明:本文为原创文章,版权归 头条123 所有,欢迎 本文,转载请保留出处!