你会不会分布式系统进程间通信?
进程间通信
关于进程间通信,我前前后后写了不下十篇,后来整理成了一两篇,无非是写:shm共享内存、消息队列、管道等方式。 但是今天我接触到了另外一种以前确实没有想过的进程间通信方法,我把它讲给我的朋友们听,他们都惊呆了。 那就是:TCP实现进程间通信。
本篇不会教你怎么使用TCP,详情请看前言。我们就来聊聊,为什么我们会为这个通信“新”方法而吃惊吧,毕竟也是经历过小风浪的人,是不会因为新奇而有这么大反应。
TCP在进程间通信的优势
首先,就是分布式系统,这点当看到TCP做进程间通信的时候我就想到了。TCP进程间通信可以跨主机,具有伸缩性,把进程分布到不同的服务器上,改改TCP端口就能用了。相反,其他IPC都不能跨机器。
其次,我兄弟天天给我吹他学的服务器到后面可以跨平台,Windows和Linux上交互,我问他他说还没学到,那现在呢?就让我先剧透吧哈哈哈哈。
在编程上,TCP sockets和pipe都是操作文件描述符,用来收发字节流,都可以read/write/fcntl/select/poll等,不同的是,TCP是全双工的,pipe是半双工的,不方便。
就拿最快的IPC,shm共享内存来说,就那么好用?对于技术不过硬的朋友来说,那可真的是坑坑洼洼,反正我是鼻青脸肿了。 或许有人会说,具体问题具体分析,单机就用shm,分布式就用TCP,我想问问,有意思吗?有意思吗?就那么喜欢为一个功能写两份代码啊。 在比对一下shm与TCP,TCP是字节流协议,只能顺序读取,有写缓冲;shm是消息协议,一个进程把内容写入虚拟地址,由另一个进程来读走,基本上可以说是阻塞。
其实我是很喜欢shm通信的,甚至都封装了动态库,在我的“动态库”专栏下就能找到,但是吧,叛变就是这么的快哈哈哈。
再者,IPC通信崩溃会怎样?段错误;TCP呢?网络掉线,哪个好找?一目了然。 TCP一断掉,哪里断了哪里重连就好,IPC呢?那就得全部重头来过。
使用TCP长连接通信
使用TCP长连接通信的好处有两点:
- 容易定位分布式系统中的服务之间的依赖关系。
只要在机器上运行
netstat -tpna | grep : port
就能立刻列出用到某服务的客户端地址,然后在客户端上用netstat
或lsof
命令找出是哪个进程发起的连接。这样在迁移服务的时候可以有效的防止出现outage。 TCP短连接和UDP连接则不具备这一特性。 - 通过收发队列的长度也比较容易定位网络中或程序故障。在正常运行时,netstat打印的Recv-Q和Send-Q都接近于0,或者在0附近波动。如果Recv-Q保持不变或持续增加,一般是服务进程的处理速度变慢,可能是死锁或阻塞了。如果Send-Q保持不变或持续增长,那可能是对方服务器太忙,没空理你,也有可能是网络中某个路由器或者交换机挂了,甚至对方掉线了。
下面是个示例:
- Kafka剖析系列之Benchmark
- 初探React与D3的结合-或许是visualization的新突破?
- Redis 在Centos Linux 上的启动脚本
- 理解JavaScript的临时包装对象
- JavaScript实现私有属性
- 使用LRU算法缓存图片,android 3.0
- 深入理解JavaScript原型:prototype,__proto__和constructor
- Comparable 与 Comparator 浅析
- 必应首页平铺背景图片的实现方案
- 我们是如何优化HAProxy以让其支持200万个并发SSL连接的?
- 【译】《Understanding ECMAScript6》- 第八章-Module
- 【译】《Understanding ECMAScript6》- 第七章-Promise
- 自定义gradview
- Redis 起步
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解Android实现购物车页面及购物车效果(点击动画)
- Android利用LitePal操作数据库存取图片
- Android 改变图标原有颜色和搜索框的实例代码
- Android自定义滑动验证条的示例代码
- Android实现图片转高斯模糊以及高斯模糊布局
- android多媒体类VideoView使用方法详解
- Android编程实现短信收发及语音播报提示功能示例
- Android viewpager无限轮播获取网络图片功能
- Android 使用ContentObserver监听数据库内容是否更改
- Android UI中TextView的使用方法
- Android 中通过ViewDragHelper实现ListView的Item的侧拉划出效果
- 浅谈Android中使用异步线程更新UI视图的几种方法
- Android gradle打包并自动上传的方法
- Android 后台发送邮件到指定邮箱
- Android中socketpair双向通信详解