应用程序的通信成本
什么是通信
一个程序中两个以上功能相互传递信号或数据叫做通信。
什么是成本
这是是指时间成本与空间成本。 时间就是传递数据所花费的时间。空间是指传递过程耗费容量大小。
都有哪些通信方式
- 全局变量
- 线程间通信
- 共享内存
- 共享文件
- 管道
- Socket
- 硬件(串口,USB) 等等
全局变量
全局变量是成本最低通信方法,通过设置全局变量,在程序运行时过程中均可操作该变量,用户信号传递,数据传输。
线程间通信
线程间通信也是采用全局变量方式,通常线程库会提供一套完善的API供用户使用,它可以实现共享,锁,互斥等机制。
共享内存
共享内存是在内存中申请开辟一个区域,用于数据共享存储。
共享文件
将数据存储在文件中,供多线程,多进程访问,文件可以上锁与解锁,这种方式性能最差,但对于初级开发者非常适合。 通过将文件存储在tmpfs或shm 文件系统中,可以获得不错的性能。
管道
管道是字符设备,通常是fifo(先进先出)单向通信,如果需要双工可能使用两个管道。
Socket
Socket分为 unix socket 与 tcp/udp socket. 前者只能在unix like 系统中使用。 Socket 分为阻塞与非阻塞通信。 其中tcp/udp Socket 可以跨服务器传输数据。
硬件
例如串口通信,使用串口连接两台电脑,通常速率为 9600bps,115200bps A电脑中运行
cat /dev/ttyS0
B电脑运行
cat /etc/passwd > /dev/ttyS0
可以将/etc/passwd文件从A电脑传递到B电脑。
不再本文讨论范围,这里不多述。
现在我们已经清楚了各种通信方式,这些通信方式适用于不同场景,由此出现了很多种使用方式,甚至多种方式同时使用。
服务器池概念
互联网时代的特点是,服务器不在单一一种,而是各种异构系统,我们经常会看到一个网站有多个服务器组成,因此我们将应用分布在不同的服务器上运行。 例如 Web服务器,应用服务器,缓存服务器,数据库服务器各司其职。就应用服务器还可能分成很多种类,例如搜索,内容管理,用户中心,等等。 问题来了,你会发现你的每个团队开发出一个产品,都需要一个服务器运行,每个团队都在做独立系统。不同团队开发出的功能与其他产品并不兼容,于是有了接口这种东西。 运维的问题也来了,每个应用一个服务器不太现实,但每个项目都不想与其他项目公用一个服务器资源,于是有了虚拟机。
于是我们见到的系统是这样了
+--------+
| C 应用 |
+--------+
^ ^ ^
| | |
+--------+ <-----+ | +-----> +--------+
| A 应用 | <--------+--------> | B 应用 |
+--------+ <-----+ | +-----> +--------+
| | |
V V V
+--------+
| D 应用 |
+--------+
A 应用 运行中会与其他三个服务器产生通信,一次操作建立三次连接,这样的通信成本是非常高的,如果任何一个节点出现故障都出现阻塞。 从运维角度这种配置也极其繁琐,每个节点都要配置与其他连点连接,防火墙ACL 维护也非常繁琐。 出现故障,排查也非常困难,还会消耗大量的排查时间。
进一步优化
我们将公共调用部门放在一处,然后将所有资源都放在服务器上。通过负载均衡分发调用,高可用技术解决公用接口单点问题。
+----------+
| 公共接口 |
+----------+
^ ^ ^
| | |
+------------+ | +------------+
| | |
V V V
+--------+ +--------+ +--------+
| A 应用 | | B 应用 | | C 应用 |
| B 应用 | | C 应用 | | A 应用 |
| C 应用 | | A 应用 | | B 应用 |
+--------+ +--------+ +--------+
这样的好处显而易见,服务器节点充分使用,既有高可用,又有负载均衡,保障7*24小时无故障运行。部属也方便。 注意上面:每个节点的 A,B,C 应用 加权值不同。