如何做一个千万级并发的物联网接入架构

如何做一个千万级并发的物联网接入架构,第1张

H绻�蕴�钟猩璞溉プ鲇布��叮��斐勺试吹睦朔眩��胰绻�院竺媪僖滴窳康募ぴ觯�植坏貌辉俅瓮度敫叨畹挠布��冻杀荆�踔列阅茉僮吭降纳璞敢膊荒苈�憬�匆滴窳康男枨蟆�在此种情况下,单纯的网络架构就显得捉襟见肘了,而负载均衡机制则应运而生。服务器负载均衡(Server Load Balancing),其原理是将工作任务相对均衡地分摊到多个节点(服务器集群)上执行,从而提升整个业务系统的性能。诸如LVS、HA Proxy等开源软件,可以在现有的网络基础架构之上建立负载均衡机制,以满足业务增长的需要,对于网站的来说不啻为一种廉价且有效的扩展性选择。此外,针对互联网上有可能影响数据传输的各种环节,CDN(Content Delivery Network)内容交付网络的应对方案也适时出现。CDN对网站内容的处理,主要在于利用缓存技术将静态内容快速分发至边缘节点,通过让用户就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度,同时也减轻了网站自身系统的性能压力。现在看来,貌似我们已经解决了网站发布所面临的所有瓶颈了,但是实际上问题远没有那么简单。一方面,对于数据交互比较频繁的动态内容而言,CDN只能在其中心节点与源数据节点(网站自身系统)之间做有限的传输优化,加速效果远不如静态内容做缓存分发那般明显。另一方面,随着线上业务、电子商务等领域的Web内容呈现日渐丰富,涌现出了愈发复杂的业务交付需求,这对网站的发布方而言也意味着将面临更多的挑战。因此,当我们抛开网络的传输质量、带宽拥塞程度等外界因素来看的话,又不得不正视一个问题--影响网站访问效果的最大瓶颈还是在于源数据节点自身的处理性能。以电子商务网站这种典型的大型高并发访问量的线上业务为例,其性能瓶颈最容易出现在联机事务处理(OLTP)的环节,例如访问用户进行条目查阅、订单确认等场景。产生这种情况的原因在于,网站的运营方出于数据安全等因素的考虑,是不可能将后台数据库等资源完全向CDN服务商开放的。由此造成,所有涉及到此类动态资源的访问就会频繁地经由CDN网络的边缘节点上溯到源数据节点(即网站自身系统)来请求实时地响应处理。在保障数据安全性的前提下,要解决网站的性能瓶颈问题,必须提高源数据节点的业务处理效率,因此我们还得从网络架构的设计着手。前文提到过,单台服务器的处理能力有限,当突发访问量骤然增加的时候,其性能就会成为整个系统的瓶颈,导致用户访问的响应缓慢甚至网站服务器瘫痪。为了满足高并发量访问的需求,可以通过软件手段实现服务器集群的多机负载均衡效果。然而,这种软件式的负载均衡有一个不可避免的缺点,那便是系统的稳定性和性能方面受限于软件所安装运行的服务器,一旦访问量过大时,该台服务器就恰恰成了整个系统的瓶颈所在。就一个发布线上业务的网站系统而言,前台的Web服务器由于有外部的CDN服务作为静态内容的分流渠道,尚不至于产生明显的系统瓶颈,而后台处理动态内容的核心业务系统就难免会感到压力巨大了。具体分析的话,当前的业务系统多采用客户端--中间件--数据库的三层结构设计,通常多是利用WebLogic中间件软件自带的服务器集群功能来满足高性能需求,其中一台WebLogic Server作为管理服务器负责任务调度,实现负载均衡效果。但是,当访问用户到达一定数目的时候,由于该服务器自身的硬件性能瓶颈,会造成整个系统的联机事务处理效率低下;而且由于WebLogic自身设计的原因,当任务量达到一定阀值的时候,即便是升级服务器硬件性能也无法提升其进行负载均衡调度的能力。针对上述情况,最好的办法莫过于采用硬件负载均衡设备,以解决数据流量过大、任务负荷过重所产生的系统瓶颈问题。在这一方面,业内知名的硬件厂商有F5、深信服等等。值得一提的是,深信服的应用交付产品除具有传统负载均衡功能外,其独有的单边加速技术,能够在跨运营商网络环境中,通过广域网传输文件及应用的访问时间减少30%以上,极大提高了用户体验。虽然部署硬件设备意味着一笔额外的开支,但是它给网站的整体业务系统所带来的性能提升,却是传统的软件方案所望其项背的。除此之外,专业的硬件设备所能提供的负载调度算法和健康检查机制也更加丰富、全面,有助于进一步提升关键业务发布的稳定性和持久性,这对于高并发量的大型网站而言是极具价值的。当然,对于不同规模、不同业务的网站而言,没有一概而论的设计标准,文中提到的技术手段都有着相应的适用场景,这就需要网站的架构师们做具体的规划了。

服务程序最为关键的设计是并发服务模型,当前有以下几种典型的模型:
- 单进程服务,使用非阻塞IO
使用一个进程服务多个客户,通常与客户通信的套接字设置为非阻塞的,阻塞只发生在select()、poll()、epoll_wait()等系统调用上面。这是一种行之有效的单进程状态机式服务方式,已被广泛采用。
缺点是它无法利用SMP(对称多处理器)的优势,除非启动多个进程。此外,它尝试就绪的IO文件描述符后,立即从系统调用返回,这会导致大量的系统调用发生,尤其是在较慢的字节传输时。
select()本身的实现也是有局限的:能打开的文件描述符最多不能超过FD_SETSIZE,很容易耗尽;每次从select()返回的描述符组中扫描就绪的描述符需要时间,如果就绪的描述符在末尾时更是如此(epoll特别彻底修复了这个问题)。
- 多进程服务,使用阻塞IO
也称作 accept/fork 模型,每当有客户连线时产生一个新的进程为之服务。这种方式有时是必要的,比如可以通过 *** 作系统获得良好的内存保护,可以以不同的用户身份运行程序,可以让服务运行在不同的目录下面。但是它的缺点也很明显:进程比较占资源,进程切换开销太大,共享某些信息比较麻烦。Apache 13就使用了这种模型,MaxClients数很容易就可以达到。
- 多线程服务,使用阻塞IO
也称之 accept/pthread_create模型,有新客户来时创建一个服务线程而不是服务进程。这解决了多进程服务的一些问题,比如它占用资源少,信息共享方便。但是麻烦在于线程仍有可能消耗光,线程切换也需要开销。
- 混合服务方式
所谓的混合服务方式,以打破服务方和客户方之间严格的1:1关系。基本做法是:
新客户到来时创建新的工作线程,当该工作线程检测到网络IO会有延迟时停止处理过程,返回给Server一个延迟处理状态,同时告诉 Server被延迟的文件描述符,延迟超时时间。Server会在合适的时候返回工作线程继续处理。注意这里的工作线程不是通过 pthread_create()创建的,而是被包装在专门用于处理延迟工作的函数里。
这里还有一个问题,工作线程如何检测网络IO会有延迟?方法有很多,比如设置较短的超时时间调用poll(),或者甚至使用非阻塞IO。如果是套接字,可以设置SO_RCVTIMEO和SO_SNDTIMEO选项,这样更有效率。
除了延迟线程,Server还应提供了未完成线程的支持。
如有有特别耗费时间的 *** 作,你可以在完成部分工作后停止处理,返回给Server一个未完成状态。这样Server会检查工作队列是否有别的线程,如果有则让它们运行,否则让该工作线程继续处理,这可以防止某些线程挨饿。
典型的一个混合服务模型开源实现ServerKit
Serverkit的这些线程支持功能可简化我们的服务程序设计,效率上应该也是有保证的。
2 队列(queue)
ServerKit提供的队列是一个单向链表,队列的存取是原子 *** 作,如果只有一个执行单元建议不要用,因为原子 *** 作的开销较大。
3 堆(heap)
malloc()分配内存有一定的局限,比如在多线程的环境里,需要序列化内存分配 *** 作。ServerKit提供的堆管理函数,可快速分配内存,可有效减少分配内存的序列化 *** 作,堆的大小可动态增长,堆有引用计数,这些特征比较适合多线程环境。目前ServerKit堆的最大局限是分配单元必须是固定大小。
4 日志记录
日志被保存在队列,有一个专门的线程处理队列中的日志记录:它或者调用syslog()写进系统日志,或者通过UDP直接写到远程机器。后者更有效。
5 读写锁
GNU libc也在pthreads库里实现了读写锁,如果定义了__USE_UNIX98就可以使用。不过ServerKit还提供了读写锁互相转换的函数,这使得锁的应用更为d性。比如拥有读锁的若干个线程对同一个hash表进行检索,其中一个线程检索到了数据,此时需要修改它,一种办法是获取写锁,但这会导致释放读锁和获取写锁之间存在时间窗,另一种办法是使用ServerKit提供的函数把读锁转换成写锁,无疑这种方式更有效率。
除了以上这些功能,ServerKit还提供了数据库连接池的管理(当前只支持MySQL)和序列化(Sequences),如感兴趣可参见相关的API文档。
二、ServerKit服务模块编写
ServerKit由3部分组成:server程序,负责加载服务模块、解析配置文件、建立数据库连接池;libserver,动态链接库,提供所有功能的库支持,包括server本身也是调用这个库写的;API,编程接口,你编写的服务模块和ServerKit框架进行对话的接口。
ServerKit需要libConfuse解析配置文件,所以出了安装ServerKit,还需要安装libConfuse。关于libConfuse可参考 >

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13210933.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-21
下一篇 2023-06-21

发表评论

登录后才能评论

评论列表(0条)

保存