高并发分布式子系统之间如何高效的通信

hypo
  • 19

看到网上些构架分享,把一个大系统划分成多个子系统,分别部署在不同的服务器,高并发的情况下各个子系统之间是用什么技术连接并通信的呢?
大概了解了下,可能有HTTP,SOCKET等,不知道这些方式性能如何,或者有什么其他技术.
之前看了看Pomelo的设计,各个部分通过socket连接,通过RPC来调用
但是目前项目使用的PHP,如果分子系统,担心高并发的时候,性能跟不上.

回复
阅读 7.3k
2 个回答
✓ 已被采纳

我说下我自己的观点,因为我不是写php的而是写java的,我就说说我对java中的分布式的理解吧。其实应该是互通的吧。
个人接触的分布式不是很多,如果说的不对请大家指正。
首先,当我们的项目慢慢变大,一台机器上的资源毕竟是有限的,所以分成不同的子项目部署在不同的机器是必须的。
那么各个不同的项目之间的通信就成了一个必须要解决的问题了。就目前我接触的技术来看,这快主要是通过基础的网络通信组成的,说白了就是肯定涉及到TCP/IP或者UDP协议。说几个具体的例子吧:

  1. 一开始一个项目,因为独立出来的子项目比较少。所以在项目之间的通信我用的是hassian.具体我也看了hassian的源码,它底层是通过动态代理,然后调用http协议来传递数据的,那么他和普通的接口有什么区别呢。我们知道普通http接口通过返回的是一个json字符串或者xml格式的数据,其实对json数据和xml数据的解析是很费时间的。那么hassian是通过什么来实现的呢?它在服务端通过序列化,将数据对象序列化然后通过HTTP协议传递给客户端。客户端接受到数据然后反序列化,将接受的信息转换成数据对象,而至于它们之间的序列化和反序列的方式hassian已经给你封装好了。

  2. 现在的项目是用阿里的开源Dubbo服务框架。hassian框架我们在使用的时候我们的通信是主动的。怎么解释这个主动呢,用面向对象里面的术语就是A对象调用B的数据,A必须要知道B的存在,然后new一个B出来,然后再去数据呢,这就相当于Hassian的独立工程的通信方式。而dubbo呢它有一个注册中心。当你需要服务的时候你只需要往注册中心拿就好了。这相当于对象AB之间引入了一个对象C,A想拿B的数据只要和C说,而B也会把它的数据线测试到C里面。其实很多设计模式里面都是用这种方式来将各个对象解耦的。
    当你的独立子工程多了以后,用Dubbo耦合度明显会比hassian少,依赖少。当然Dubbo的功能还不仅仅只是这个具体的可以去看Dubbo的文档。

现在来回答楼主的问题:性能。网络IO肯定会消耗性能的。当出现高并发的时候,会频繁的进行网络I/O这个就想读取数据库一样。为什么要存数据库进行持久化,而不就存在内存里面呢?存取的时候不是更加快嘛。所以这之间会有一个权衡的过程。
当然当发生高并发时候,可能出现的问题就是,服务的工程接受的请求过多,负载过高。这个时候就需要考虑集群化处理了,然后就出现了各种消息中间件什么的。其实我这块我也不是很懂。
个人观点,如果有错误欢迎指正。

如果业务性较强可以把子系统设计成微服务,公开rest接口。如仅是功能性或数据同步性的分布,可以使用tcp/udp层的multicast机制,比如java界的分布式缓存ehcache就是采用组播机制。

宣传栏