整理的OSChina 第 38 期高手问答 —— ESB 企业服务总线,嘉宾为@肖俊_David 。
@肖俊_David 恒拓开源架构师,热衷于JAVA开发,有多年的企业级开发经验。曾参和设计和开发基于FuseESB 企业级服务总线系统,对FuseESB企业级服务总线以及内嵌的Camel/ActiveMQ 有深刻的理解。
ESB 全称为Enterprise Service Bus,即企业服务总线。它是传统中间件技术与XML、Web服务等技术结合的产物。ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素。ESB的出现改变了传统的软件架构,可以提供比传统中间件产品更为廉价的解决方案,同时它还可以消除不同应用之间的技术差异,让不同的应用服务器协调运作,实现了不同服务之间的通信与整合。从功能上看,ESB提供了事件驱动和文档导向的处理模式,以及分布式的运行管理机制,它支持基于内容的路由和过滤,具备了复杂数据的传输能力,并可以提供一系列的标准接口。
ESB 相关的开源软件:http://www.oschina.net/project/tag/333/esb
主要有价值的问题整理如下:
1、先简单介绍下 ESB 的应用场景吧,相信很多人还是不太了解 。
肖:一般用在企业内部业务系统比较多,相互之间调用比较复杂,接口的维护花费比较大,并且不同的系统采用了不同的开发平台、传输协议、数据格式等,这种情况下就需要考虑使用ESB了 。
2、这么庞大的一个系统,设计时候遇到的难题及解决方法是什么?在系统性能上从那些方面优化?
肖:主要体现在各业务系统数据的整合/ESB路由的安全/流量控制等方面。 性能方面是这些方面的优化:负载均衡/应用服务器集群/缓存/数据库的读写分离/Restful WS/WS接口数据的压缩/消息的异步传输/。具体可以参考此文档http://www.oschina.net/doc/593。
3、对于大并发的实时交易的系统,选用ESB作为数据总线,其性能如何?在线人数100万,并发1000左右的交易,基于WS与ESB进行对接,中间不介入MQ 。
肖:根据我们对Fuse ESB的性能测试情况,直接访问WS与通过ESB来访问WS,性能影响不大,当然具体的性能损耗,还与你采用的ESB产品有关!我们目前做的项目,部署了两台ESB,前面通过LVS做负载均衡,调用WS的TPS可以达到 600-800左右。
4、ESB的具体应用及其担任的角色是什么呢?
肖:中介、路由转发、格式转换、协议转换、安全控制。
追问:您好,针对于您说的路由转发,可否再阐述下,
肖:就是说路由转发的机制,可以是业务人员定义的,由业务人员来定制转发的流程。
5、ActiveMQ 比较适合哪些企业应用场景?能否举个例子简单说明下,体现使用了ActiveMQ的价值。
肖:ActiveMQ主要优势体现在消息的异步/推送上, 提供了多种语言的客户端。它可以用于异构系统的整合,如我需要向其它系统推送一个消息,只需要把消息发送到MQ服务器,便可以去做其它事情,MQ服务器来保证其它系统数据的接收;另外,系统包含大量的业务日志数据,也可以考虑使用MQ来异步处理。
追问:MQ服务器一般采取哪些部署方案呢?对于处理大量业务日志,单台MQ服务器是否足够?
肖:看机器性能, 我这边性能测试 4核/4G内存/linux,MQ的收发大概可以到5000条/秒。如果有高可用的需求,需要做MQ集群。
追问:你是说先把日志内容发给MQ,再由MQ发送给日志系统?
肖:是的。
6.请问实际的安全问题是怎么处理的,给点思路,谢谢。
肖:在ESB的路由程序中,加入安全认证机制。如用户名/密码认证,访问控制认证等。MQ的安全认证,可以通过安全插件来实现。
追问:谢谢哈,那我还想了解下路由程序的大概作用,是不是就是处理请求,使其匹配业务逻辑的那种?
肖:具体可以参考此文档,第二个案例 http://www.oschina.net/doc/593 。
7.能不能介绍下现在主流的esb产品. 包括商业和开源的?
能不能重点介绍下fuse产品,要是直接部署使用的话,有什么要注意的.
fuse好像是基于osgi的.话说osgi好像比较难搞呀.
个人能不能提供咨询服务?
肖:商业主要有 IBM/ORACLE ESB,高达6/700W 的单机许可费。开源的有ServiceMix/Fuse/JBOSS/Mule 等ESB产品。 ServiceMix/Fuse ESB 4.X以后是基于OSGI架构的,提供了很好的扩展性,上手是有点难度。目前很多产品都在往OSGI靠拢,如JBOSS AS 7。 谈不上咨询,大家互相交流学习。
8.如果所有的服务接口都接入ESB,ESB怎么保证安全服务,如果ESB挂掉,那所有的应用系统也无法服务了,加一些缓存集群是否能彻底解决这样的问题,可否做到我调用一台机器时那台机器挂了,直接将服务切到另一台机?肖:可以部署多台ESB集群,在ESB前面可以通过F5/LVS等来做负载均衡,若是LVS,可以通过心跳来检测当前ESB的服务状态,若是一台出现宕机情况,可以把请求转发到其它ESB 。
9.问个具体点的问题,我做了个实验项目,架构是这样的:webapp+serviceMix,需要在webapp端控制路由的部署和启停。
部署就是将bundle放到相应的文件夹下了,命令通信还没实现,找了资料(http://svn.apache.org/repos/asf/karaf/trunk/client/src/main/java/org/apache/karaf/client/Main.java)是用ssh实现的,
不知道除了这个还有没有其他更好的方法。另外,部署不知道还有没有其他方法。
肖:这种是通过远程SSH,来管理ESB控制台,控制bundle的启动和运行。你可以参考下 Karaf的 webconsole是如何做的bundle管理。
追问:谢谢,借此机会多问一下,想请问下除了用ssh远程管理esb外,还有没有其他方案可以让web与esb结合,比如在webapp中集成karaf和camel可行不?另外apache ode已经与新版本jboss esb不兼容了,你们是如何做webservice编排的?多谢了~
肖:ESB 部署bundle,bundle集成Camel,服务编排用Camel 的 EIP 。
追问:谢谢,个人认为Camel EIP不太适合做服务编排,虽然有java DSL,还是没有BPEL合适。现在在用bpel-g 。
肖:bpel是基于SOAP协议的,会占用大量带宽。
10、想问一下开源的esb选择哪个比较好,现在在openESB和WSO2 esb中犹豫,希望得到您的指导。
肖:这两种ESB我还未使用过:),建议你用主流ESB。
11、ESB能够提供什么服务,能够帮助解决问题1中的这些问题?为什么要使用ESB?如果不使用,其实没什么问题,对不对?它最大吸引力在哪里?
肖:1、多系统之间的互相调用会造成网状结构错综复杂 。
2、接入ESB后,服务都集中在一处调用,原系统如果是以ws公开的服务,经过esb包装之后,可以公开称多种协议适配各种客户系统调用 。
3、ESB可以统一的进行日志、安全和权限以及SLA治理,很方便进行控制。
4、ESB作为众多系统的入口,还可以很方便的在一处实现跨系统的流程整合和编排 。
12、除了 Redhat 和 JBoss 的文档,还有什么好的 Fuse ESB 学习资料吗?
肖:很多,Fuse ESB集成了很多开源项目,如Karaf/CXF/ActiveMQ/OSGI等,这些你都需要有所了解,去他们的官方有文档,书籍方面 你可以参考 Open Source ESBs In Action不过版本有点老了。
13、在医院的药品管理系统、挂号系统、医生/护士工作站、财务等各种his系统当中esb可以扮演什么角色?或者说他适用这种环境吗?有木有类似的项目?哈哈,我是业余前端,问得不好还请见谅。
肖:可以适用,接口都可以接入ESB。
14、activimq用topic还是queue?对于客户端向ESB发送数据需要返回值的情况,对于activimq 有什么好的解决方法没?
肖:目前好像还没好的办法,可以创建一个返回队列来实现 JMSReplyTo 。
other:既然对于请求需要有返回值,这属于RPC的范畴了。可以基于 Camel 做 RPC。
15、esb对性能是不是有很大影响,刚用,发现速度会差一半.
肖:看不同的ESB产品 ,Fuse ESB我们做性能测试,性能损耗是很小的。
16、另外想咨询:
1、在设计数据变更推送的机制,我们目前是在数据表上加触发器有字段更新写到中间表记录,然后一个定时任务去扫描这个中间表,然后形成特定的发送记录。
2、ActiveMQ 在大量消息下性能是否可靠?
3、ESB接入多个系统后,是直接访问源系统的数据库,还是在中间库做一份镜像?如果是直接访问数据库,事务控制等应该怎么做?如果是中间库,如何保证数据的实时性呢?
肖:大量消息下,消息的可靠性是没问题的,MQ做了大量的工作保证消息的可靠性,如消息存储在文件/客户端的确认机制等,性能上要根据实际的场景调优MQ的性能。 我们是把其它业务系统的核心数据抽取到本地库中,通过Kettle ETL+quartz定时抽取。如果实时性比较高,可以考虑数据库复制,触发器等。
17、现在项目是不是已经整合到JBoss ESB中了呢?相关的文档都需要从JBoss上下载吗?
肖:http://www.jboss.org/products/fuse http://fusesource.com/products/enterprise-servicemix/
18、想问下在ESB中,在多个系统交互时,如何控制数据的一致性呢?遇到异常如何回滚呢?
肖:事务的补偿机制。
追问:ESB中有实现事物补偿的么?那些资料可以参考呢?
19、现在的 ServiceMix 支持部署 WAR 应用了吗?
肖:支持。
追问:这个回复过于简单了。OSGI-4.3引入了WAR支持。WAR首先被转换成一个bundle(WAB),然后启动。在这个过程中,很容易出现类库冲突,导致启动失败。详情请参考osgi.cmpn-4.3.0.pdf("OSGi Service Platform Service Compendium")中的"Web Applications Specification"章节 。
另外,OSGI也有自己的适用场景,如果没有模块化需求,不应该引入OSGI。单纯的WAR项目就没有必要改造成OSGI项目。
肖:除了 OSGi,模块化还有什么别的选择?SOA?
话说 Spring 不支持 OSGi 的原因是什么呢?Hibernate也是用Gradle构建,照样在努力地向 OSGi 靠拢。
追问:应该是吧。我认为,OSGI 也可以认为是广义上的 SOA . Spring 支持 OSGI 的啊,你是不是看错了?
肖:InfoQ 上等过 SpringSource 打算放弃支持 OSGi 的新闻。
在最新的版本里面已经移除了 OSGi 的 manifest 文件,我是从 Maven 官方库里面下的 。
追问: 你这么一说我也记起来了。之前 Spring 是支持 OSGI 的,动态模块还是 spring 搞出来的。放弃支持是他们的决定吧,我觉得OSGI的复杂性应该是其中的重要因素。
20、消息能支持多大呢?能否支持10M以上文件推送?
肖:你指的MQ?
追问:对, ESB 一般不包括MQ这样的消息中间件吗?
肖:可以试试 MQ的BlobMessage;或者把文件拆分然后分组发送。对于太大的文件不建议使用MQ来传输。
21、关于分布式日志采集,一般说可以采用ActiveMQ/MetaQ等实现。我的疑问是:网络写速度比不上本地文件系统写,实践中怎么解决这个问题?
肖:分布式日志采集,这里没看懂。是对分布式系统的日志采集?
22、为什么不把部分接口服务以RESTful方式暴露,看你里面全是webservice。
肖:是Restful风格的WS。
23、ESB和RPC(比如Dubbo/Corba/ICE)等适用场景,能介绍一下吗?谢谢。
肖:ESB和RPC是完全不同的两个概念,PRC是点对点的消息传递,ESB是所有的服务接口都接入到ESB,通过它来转发 。
24、正好我也是在做ESB,我想请教您,对于Mule ESB 有所了解吗? 或者您是否能提供一点你选用Fuse ESB方案的考虑吗?
肖:这个是我们ESB技术选型的一部分资料:
Mule ESB拥有了不错的用户量,且比较容易上手,但其由于其企业版是商业产品,相需要收费,且架构本身并没有成为规范,因此,若在没有源码的情况下大规模使用,一旦出问题,可能需要专业技术团队的支持。另外,Mule之前是没有自己的消息中间件的,且不支持热部署,收购Mule MQ之后才真正成为一个正式成熟的ESB。
Fuse ESB很好的支持了JBI规范,其下产品均是由Apache下的著名开源项目组合而成。其中若干框架均已为开源世界广泛应用,比如Apache Camel和Apache ServiceMix,尤其是其中的Apache ActiveMQ和Apache CXF,且ServiceMix 4之后基于OSGi架构,更能迎合企业动态化、模块化的需求。此外,Fuse有丰富的文档支持,加上其主要框架为大多开源人士所熟知,技术上可控性强,风险较小。
25、问题如下:
1、同步接口调用,怎么处理?有一些需求要同步返回调用结果。
2、想涉及一些支付业务的服务,事务怎么处理?
如:下订单业务,首先要调用“商品模块服务”查询库存,然后才能决定下单业务是否可以继续,如果库存充足,则要:
1)调用“商品模块服务”锁库 。
2)调用“订单模块服务”保存订单。
他们之间的事务怎么保证?能否给些思路。
肖:ESB 只是做了路由转发功能,除了MQ,大部分都是同步的。Camel内部也做了一些事务的保障机制, 若是中间牵扯到了 多系统流程服务的编排,最好定义好发生异常后事务的补偿机制。
26、能不能多讲一下ESB的应用场景和不适合的应用场景。
肖:涉及到多系统整合或者服务流程整合,就要考虑是否需要上ESB。
27、FuseESB 稳定版本是哪个版本?下载时候是 6.0 版本包,怎么官方文档是 7.1 ,还没搞明白。
肖:7.1是没被收购之前的,现在被redhat收购,改名叫 Jboss Fuse。
28、将各种异构的子系统整合,由一个统一的中间件调度服务的架构就可以称作ESB吗?
肖:这个是ESB的核心功能,还包括服务编排/消息增强/协议转换/格式转换/安全控制/服务质量等。
29、ESB怎么保证消息的可靠传递?
肖:如果是JMS消息,ESB中的MQ会持久化该消息到文件或者数据库。若是其它协议的消息,发生异常或者其它自定义状况,ESB会捕获到该状况然后经过处理告诉客户端。
30、您好,能否比较几种常见的ESB产品(集),mule esb/cordys/Jboss esb/open esb ? 它们分别的适用场合是什么?特别是您对Cordys的看法?
肖:ESB的功能都差不多,你要更详细的比较:可以去看看 Forrester研究公司(http://www.forrester.com),在2011年第二季度对“企业级服务总线”做了一个详尽的研究报告,比较了IBM、Oracle、Progress Software、Software AG、Tibco、FuseSource、MuleSoft、Red Hat和WSO2等诸多商业和开源厂商的ESB产品。
31、ESB 对企业部门之间的信息孤岛的破解,是否有帮助,如果有的话,处理策略是什么?
肖:造成信息孤岛的原因主要是系统之间通讯不畅,把各系统对外的接口都统一连到ESB即可,避免各系统的相互调用造成复杂的网状结构。
other:n*n 和 1*n ,这种在系统庞大的企业中,是非常有价值的。
jack:谈到ESB两大主流是Mule和Camel。Mule用户多一点。不过Camel接口更多,而且迭代速度更快。试过Camel+karaf发现对数据库支持这块osgi略差一些。于是采用Camel+spring。使用下来各方面都很出色,推荐此方案。
32、请问ActiveMQ用的什么版本?怎么整合的?如何保证数据消费的可靠性,有没有出现丢消息或者假死的问题?
肖:Fuse ESB默认就集成ActiveMQ,未出现你说的现象,不过如果发的太快,收的太慢会出现你说的情况,可以在接收端增加负载来解决 。
33、esb如何解决多系统的数据一致性问题?例如在转账这种需要跨数据库事务的场合下怎么搞定?
肖:可以定义流程发生状况的补偿机制,一旦服务流程流转中出现问题,所有执行过的活动都按特定的逻辑进行补偿 。