分布式与RPC

RPC(Remote Procedure Call)—远程过程调用,RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

 

https://blog.csdn.net/world6/article/details/79114105?from=timeline

https://www.cnblogs.com/aspirant/p/5697807.html

http://server.51cto.com/News-557053.htm

充分利用资源

 

并发编程有两种基本模型,一种是message passing,另一种是shared memory。在分布式系统中,运行在多台机器上的多个进程的并行编程只有一种实用模型message passing。

在单机上,我们也可以照搬message passing作为多个进程的并发模型。这样整个分布式系统的架构的一致性很强,扩容起来也较容易。

 

进程间通信只用tcp
其最大的好处在于:可以跨主机,具有伸缩性。反正都是多进程了,如果一台机器的处理能力不够,很自然地就能用多台机器来处理。把进程分散到同一局域网的多台机器上,程序改改host:port配置就能继续用。
tcp port由一个进程独占,且操作系统会自动回收(listening port和已建立连接的TCP socket都是文件描述符,在进程结束时操作系统会关闭所有文件描述符)。这说明,即使程序意外退出,也不会给系统留下垃圾,程序重启之后能比较容易地恢复,而不需要重启操作系统。还有一个好处,既然port是独占的,那么可以防止程序重复启动,后面那个进程抢不到port,自然就没法初始化了,避免造成意料之外的结果。
两个进程通过tcp通信,如果一个崩溃了,操作系统会关闭连接,另一个进程几乎立刻就能感知,可以快速failover。
tcp还能跨语言。

生产环境下的数据库服务器往往是独立的高配置服务器,一般不会同时运行其他占资源的程序。

tcpcopy压力测试

 

分布式系统中使用TCP长连接通信
分布式系统的软件设计和功能划分一般应该以“进程”为单位。从宏观上看,一个分布式系统是由运行在多台机器上的多个进程组成的,进程之间采用TCP长连接通信。
使用tcp长连接的好处有两点:一是容易定位分布式系统中的服务之间的依赖关系。

使用tcp长连接的好处有两点:
一是容易定位分布式系统中的服务之间的依赖关系。只要在机器上运行netstat -tpna | grep : port 就能立刻列出用到某服务的客户端地址,然后在客户端的机器上用netstat或lsof命令找出是哪个进程发起的连接。这样在迁移服务的时候能有效地防止出现outage。TCP短连接和UDP则不具备这一特性。
二是通过接收和发送队列的长度也较容易定位网络或程序故障。在正常运行的时候,netstat打印的Recv-Q和Send-Q都应该接近0,或者在0附近摆动。如果Recv-Q保持不变或持续增加,则通常意味着服务进程的处理速度变慢,可能发生了死锁或阻塞。如果Send-Q保持不变或持续增加,有可能是对方服务器太忙、来不及处理,也有可能是网络中间某个路由器或交换机故障造成丢包,甚至对方服务器掉线,这些因素都可能表现为数据发送不出去。通过持续监控Recv-Q和Send-Q就能及早预警性能或可用性故障。

必须用单线程的场合

1.程序可能会fork;

2.限制程序的CPU占用率。

 

多线程的适用场景是:提高响应速度,让IO和“计算”相互重叠,降低latency。虽然多线程不能提高绝对性能,但能提高平均响应性能。

 

线程的分类:

1.IO线程,这类线程的主循环是IO multiplexing,阻塞地等在select/poll/epoll_wait系统调用上。这类线程也处理定时事件。当然它的功能不止IO,有些简单计算也可以放入其中,比如消息的编码或解码。

2.计算线程,这类线程的主循环是blocking queue,阻塞地等在condition variable上。这类线程一般位于thread pool中。这种线程通常不涉及IO,一般要避免任何阻塞操作。

3.第三方库所用的线程,比如logging,又比如database connection。

 

服务器程序一般不会频繁地启动和终止线程。甚至,create thread只在程序启动的时候调用,在服务运行期间是不调用的。

 

一个多线程的进程和多个相同的单线程进程该如何取舍?

可以根据工作集的大小来取舍。工作集是指服务程序响应一次请求所访问的内存大小。

 

参考:

《Linux多线程服务端编程》

 

posted @ 2018-08-26 10:06  _raindrop  阅读(212)  评论(0编辑  收藏  举报