什么是分布式系统( 三 )


通过负载均衡找到一个节点 , 接下来就是真正处理用户的请求 , 请求有可能简单 , 也有可能很复杂 。简单的请求 , 比如读取数据 , 那么很可能是有缓存的 , 即分布式缓存 , 如果缓存没有命中 , 那么需要去数据库拉取数据 。对于复杂的请求 , 可能会调用到系统中其他的服务 。
承上 , 假设服务A需要调用服务B的服务 , 首先两个节点需要通信 , 网络通信都是建立在TCP/IP协议的基础上 , 但是 , 每个应用都手写是一件冗杂、低效的事情 , 因此需要应用层的封装 , 因此有了HTTP、FTP等各种应用层协议 。当系统愈加复杂 , 提供大量的http接口也是一件困难的事情 。因此 , 有了更进一步的抽象 , 那就是RPC(call) , 是的远程调用就跟本地过程调用一样方便 , 屏蔽了网络通信等诸多细节 , 增加新的接口也更加方便 。
一个请求可能包含诸多操作 , 即在服务A上做一些操作 , 然后在服务B上做另一些操作 。比如简化版的网络购物 , 在订单服务上发货 , 在账户服务上扣款 。这两个操作需要保证原子性 , 要么都成功 , 要么都不操作 。这就涉及到分布式事务的问题 , 分布式事务是从应用层面保证一致性:某种守恒关系 。
上面说道一个请求包含多个操作 , 其实就是涉及到多个服务 , 分布式系统中有大量的服务 , 每个服务又是多个节点组成 。那么一个服务怎么找到另一个服务(的某个节点呢)?通信是需要地址的 , 怎么获取这个地址 , 最简单的办法就是配置文件写死 , 或者写入到数据库 , 但这些方法在节点数据巨大、节点动态增删的时候都不大方便 , 这个时候就需要服务注册与发现:提供服务的节点向一个协调中心注册自己的地址 , 使用服务的节点去协调中心拉取地址 。
从上可以看见 , 协调中心提供了中心化的服务:以一组节点提供类似单点的服务 , 使用非常广泛 , 比如命令服务、分布式锁 。协调中心最出名的就是 ,  。
回到用户请求这个点 , 请求操作会产生一些数据、日志 , 通常为信息 , 其他一些系统可能会对这些消息感兴趣 , 比如个性化推荐、监控等 , 这里就抽象出了两个概念 , 消息的生产者与消费者 。那么生产者怎么讲消息发送给消费者呢 , RPC并不是一个很好的选择 , 因为RPC肯定得指定消息发给谁 , 但实际的情况是生产者并不清楚、也不关心谁会消费这个消息 , 这个时候消息队列就出马了 。简单来说 , 生产者只用往消息队列里面发就行了 , 队列会将消息按主题(topic)分发给关注这个主题的消费者 。消息队列起到了异步处理、应用解耦的作用 。
这里的视频是每天不断更新的 , 每天都有新的视频每天都有大牛讲解新的技术 , 如果想学习Java工程化、高性能及分布式、深入浅出 。性能调优、 ,  , Netty源码分析的朋友可以加Java进阶群: , 群里有阿里大牛直播讲解技术 , 以及Java大型互联网技术的视频免费分享给大家 。
上面提到 , 用户操作会产生一些数据 , 这些数据忠实记录了用户的操作习惯、喜好 , 是各行各业最宝贵的财富 。比如各种推荐、广告投放、自动识别 。这就催生了分布式计算平台 , 比如 , Storm等 , 用来处理这些海量的数据 。