分布式编程基础知识都有哪些
分布式编程基础知识都有哪些
分布式编程开发是目前大多数软件开发程序员都在学习的一个编程技术,下面我们就给大家简单分享一些分布式编程基础知识都有哪些。
业务服务
代表某一领域的业务提供的服务,对于电商而言,领域有用户、商品、订单、红包、支付业务等等,不同的领域提供不同的服务。
这些不同的领域构成一个个模块,良好的模块划分和接口设计非常重要,一般是参考高内聚、接口收敛的原则,这样可以提高整个系统的可用性。当然可以根据应用规模的大小,模块可以部署在一起,对于大规模的应用,一般是独立部署的。
高并发
业务层对外协议以NIO的RPC方式暴露,可以采用比较成熟的NIO通讯框架,如netty、mina
高可用
为了提高模块服务的可用性,一个模块部署在多个节点做冗余,并自动进行负载转发和失效转移;
初可以利用VIP+heartbeat方式,目前系统有一个单独的组件HA,利用zookeeper实现(比原来方案的优点)
一致性、事务:
对于分布式系统的一致性,尽量满足可用性,一致性可以通过校对来达到终一致的状态。
基础服务中间件
通信组件
通信组件用于业务系统内部服务之间的调用,在大并发的电商平台中,需要满足高并发高吞吐量的要求。
整个通信组件包括客户端和服务端两部分。
客户端和服务器端维护的是长连接,可以减少每次请求建立连接的开销,在客户端对于每个服务器定义一个连接池,初始化连接后,可以并发连接服务端进行RPC操作,连接池中的长连接需要心跳维护,设置请求超时时间。
对于长连接的维护过程可以分两个阶段,一个是发送请求过程,另外一个是接收响应过程。
发送请求时,若发生IOException,则把该连接标记失效。
接收响应时,服务端返回SocketTimeoutException,如果设置了超时时间,那么就直接返回异常,清除当前连接中那些超时的请求。否则继续发送心跳包(因为可能是丢包,超过pingInterval间隔时间就发送ping操作)
若ping不通(发送IOException),则说明当前连接是有问题的,那么就把当前连接标记成已经失效;
若ping通,则说明当前连接是可靠的,继续进行读操作。失效的连接会从连接池中清除掉。
每个连接对于接收响应来说都以单独的线程运行,客户端可以通过同步(wait,notify)方式或者异步进行rpc调用,序列化采用更高效的hession序列化方式。
服务端采用事件驱动的NIO的MINA框架/Netty框架,支撑高并发高吞吐量的请求。
路由Router
在大多数的数据库切分解决方案中,为了提高数据库的吞吐量,先是对不同的表进行垂直切分到不同的数据库中,然后当数据库中一个表超过一定大小时,需要对该表进行水平切分,这里也是一样,这里以用户表为例,对于访问数据库客户端来讲,需要根据用户的ID,定位到需要访问的数据;
数据切分算法
根据用户的ID做hash操作,一致性Hash,这种方式存在失效数据的迁移问题,迁移时间内服务不可用,维护路由表,路由表中存储用户和sharding的映射关系,sharding分为leader和replica,分别负责写和读。
这样每个biz客户端都需要保持所有sharding的连接池,这样有个缺点是会产生全连接的问题;
解决方法是sharding的切分提到业务服务层进行,每个业务节点只维护一个shard的连接即可。