我对java分布式系统的一点认识 - biakia

标签: java 分布 系统 | 发表时间:2015-09-02 23:13 | 作者:biakia
出处:

相对于单机系统,分布式系统非常复杂,涉及到非常多的技术,作为一个屌丝,有幸能够在大规模分布式系统下工作,故在此记录一些浅薄认识,作为自己未来学习路线的参考。

一、分布式系统概述

分布式系统往往是把应用拆分成多个应用,每个团队维护一个应用,应用与应用通过远程过程调用或者消息中间件通信。这种系统的优点是能够做到高内聚低耦合,可以支撑业务的快速发展,缺点则是运维成本大大提高了,系统出了问题,需要全链路排查。如图所示,用户使用应用A,应用A首先需要调用应用B,然后调用应用C,其中应用B又要调用应用D和E,其中任何一个应用挂了,都会影响整个系统的链路。以上只是一个很简单的例子,真实的系统之间的依赖关系往往非常复杂。

 

二 分布式系统下的技术栈

在此主要是挖个坑,后续我会一个一个填的。。。

对于分布式系统中的某个应用来说,它的入口往往有三个:远程过程调用(其他应用来调用我的服务)、消息中间件(我订阅了其他系统的消息,其他系统会给我发消息)、web访问(主要访问页面),它的出口则有很多:远程过程调用(调用其他应用的服务)、消息中间件(我向消息服务器发消息,供其他应用消费)、访问分布式缓存、访问分布式日志、访问数据库,执行调度任务。有了入口和出口,剩下的就是应用的核心部分,包括核心逻辑代码和辅助框架。对于分布式系统来说,有个东西必不可少,那就是配置中心。无论是远程过程调用、消息中间件还是分布式缓存,它们都需要从配置中心获取地址列表。

下面简要概括一下分布式系统涉及的技术:

1、远程服务框架:远程服务框架是分布式系统中不可或缺的,对于远程服务框架来说,关键的几个点是:服务消费者、服务提供者、协议(java序列号、反序列化、hessian协议等等)、网络(NIO、多路复用等等)、地址列表。其中协议的选择、网络的优化以及地址列表的获取是难点。目前业界比较有名的开源框架有:Apache Thrift(跨语言)、Dubbo等等。

2、消息中间件:引入消息中间件是用来降低应用之间的耦合的。对于上游应用来说,它往往会依赖非常多的下游应用,如果全部用同步调用(远程过程调用就是同步调用)的方式,那么上游应用必须等到所有下游应用全部执行成功后,才能返回成功,这种等待往往是不可忍受的。为此,需要将同步异步化,而消息中间件可以实现这种异步化。使用消息中间件后,上游应用只需要向消息服务器发送消息就可以了,它不用等待所有应用执行完,它可以提前返回执行成功,后续,消息服务器会去向这些下游应用发消息,通知它们执行。虽然异步化降低了应用之间的耦合,但也引入了新的问题。比如,下游系统执行的时候挂了,而这时候上游系统其实是返回的成功,这样就导致了状态不一致。要解决这个问题,就需要使用消息中间件本身的重试机制,对于一些系统异常,需要重试直到成功,对于应用本身,又需要对这种重试进行幂等处理,并且使用正向状态机管理整个系统的状态。消息中间件的规范可以参考JMS,业界也有成熟的开源方案,比如ActivityMQ。

3、wrapper层:warpper层主要是上面两个入口的包装层,进行一些异常管理,日志管理和AOP拦截

4、MVC框架:这个不用多说了吧,个人比较喜欢spring MVC,有空可以阅读下源代码

5、分布式缓存:待填坑。。

6、分布式日志:待填坑。。

7、文件存储系统:待填坑。。

8、IOC容器:目前用的最多的是spring容器,对于spring的核心的几个模块,可以参考《spring源码深度解析》

9、ORM框架:ORM最好使用ibatis,不推荐hibernate,因为ibatis可以控制sql,在大数据量读写下,必须对sql进行优化。至于ibatis本身的架构,有空我会单独写文章。

10、调度引擎:用于执行异步的定时任务的引擎,待填坑。。

11、分布式数据访问层:正在学习中。。

12、配置中心:统一的配置管理中心,待填坑。。

13、web容器:tomcat,结合《tomcat源代码分析》和tomcat本身的源代码,应该可以很容易的懂tomcat的架构和实现。

14、业务逻辑层:流程引擎和规则引擎,配合spring来治理极易变动的业务逻辑,后续有空单独写个流程引擎

 


本文链接: 我对java分布式系统的一点认识,转载请注明。

相关 [java 分布 系统] 推荐:

我对java分布式系统的一点认识 - biakia

- - 博客园_首页
相对于单机系统,分布式系统非常复杂,涉及到非常多的技术,作为一个屌丝,有幸能够在大规模分布式系统下工作,故在此记录一些浅薄认识,作为自己未来学习路线的参考. 分布式系统往往是把应用拆分成多个应用,每个团队维护一个应用,应用与应用通过远程过程调用或者消息中间件通信. 这种系统的优点是能够做到高内聚低耦合,可以支撑业务的快速发展,缺点则是运维成本大大提高了,系统出了问题,需要全链路排查.

python/java操作linux系统命令

- 天朝小民 - ITeye论坛最新讨论
看来python的确是做为脚本语言来使用的话,非常的方便. 来看一个处理linux命令的脚本. #coding:utf-8 import os import commands ''' 采用os.popen(cmd)来执行命令,要获取输出,需要read()来读取 ''' cmd = 'ls -l' values = os.popen(cmd).read() #print values for v in values.split('\n'):.

Java系统程序员修炼之道

- - 博客 - 伯乐在线
从2002开始接触Java学会HelloWorld这么经典的程序到如今不知不觉已经十年啦,十年中亲耳听到过不少大牛的演讲,见到过项目中的神人在键盘上运指如飞的编程速度,当时就被震撼了. 当编程越来越成体力活,我们还能有自己的思想,还能修炼为Java系统级别的 程序员嘛. 学习与修炼以下知识与技能,帮你早日达成愿望.

构建高性能高并发Java系统

- scourgen - ITeye博客
异步通信显然可以更快的返回响应. 从实际经验看,对高吞吐服务器更大的好处是,系统中的某一服务出现问题后往往出现雪崩似的服务宕机. 这很多都是由于采用同步通信,需要等待其他服务同步通信结束后,其占用资源才能得到释放. 而这些资源往往是socket连接、线程、数据库连接等比较重的资源. 如果你真的需要他,可以用个mock同步.

多核系统上的 Java 并发缺陷模式(bug patterns)

- yat - IBM developerWorks 中国 : 文档库
通过研究并发(bug patterns)缺陷模式,您既能够提高对并发编程的理解,还能够了解如何发现无效或可能无效的编程方法. 在本文中,作者 Zhi Da Luo、Yarden Nir-Buchbinder 和. Raja Das 阐述了 6 个鲜为人知的、可能威胁运行在多核系统上的 Java 应用程序的线程安全和性能的并发缺陷.

"Java在淘宝AD系统中的应用"分享汇总

- - ITeye博客
条幅AD 搜索AD 定向AD. 高性能Web服务器 关系数据库,内存KV数据库, NoSQL (BigTable) 搜索引擎 排序算法(Ranking) 实时计算 海量日志收集和处理(MapReduce, 报表和结算) RPC,消息中间件 客户端技术:浏览器,Javascript. 多个子系统都采用Java实现:.

java Runtime.getRuntime().exec 调用系统脚本/命令注意事项

- - 编程语言 - ITeye博客
原因:不会被再次解析,管道符失效. linux还有一种方法:. 命令【ehco】就是向标准输出设备输出引号中的内容. 这里将使用管道命令” |“将【echo】命令的输出作为【openssl】命令的输入. 在Java程序中调用Shell命令. * @param data 要加密的数据. * @param commonKey 加密口令文件名.

解决win7以上系统 java只获取IPv6的问题

- - 编程语言 - ITeye博客
如果系统中开启了IPV6协议(比如window7),java网络编程经常会获取到IPv6的地址,这明显不是我们想要的结果,搜索发现很多蹩脚的做法是:禁止IPv6协议. 其实查看官方文档有详细的说明:. 在实际的运用中有以下几种办法可以实现指定获取IPv4的地址:. 在java启动命令中增加一个属性配置:-Djava.net.preferIPv4Stack=true.

如何使用bloomfilter构建大型Java缓存系统

- - ImportNew
在如今的软件当中,缓存是解决很多问题的一个关键概念. 你的应用可能会进行CPU密集型运算. 你当然不想让这些运算一边又一边的重复执行,相反,你可以只执行一次, 把这个结果放在内存中作为缓存. 有时系统的瓶颈在I/O操作上,比如你不想重复的查询数据库,你想把结果缓存起来,只在数据发生变化时才去数据查询来更新缓存.

SnowFlake 分布式ID生成算法Java实现

- - ITeye博客
SnowFlake 分布式ID生成Java实现. SnowFlake不依赖第三方介质,不像基于ZK,Redis等,每次用完一个区间还得通过网络去获取下一个区间,效率较低,基于SnowFlake的分布式ID生成是目前我见过的最快的. SnowFlake生成的是一个64位的数字,其中42位时间戳,接下来10位是自定义的数,其作用就是区分集群中的所有机器,最后12位是毫秒内序列,集群内每个机器能够在1毫秒内生成2^12 - 1个ID.