Kafka宕机引发的高可用问题
问题要从一次Kafka的宕机开始说起。
笔者所在的是一家金融科技公司,但公司内部并没有采用在金融支付领域更为流行的RabbitMQ,而是采用了设计之初就为日志处理而生的Kafka,所以我一直很好奇Kafka的高可用实现和保障。从Kafka部署后,系统内部使用的Kafka一直运行稳定,没有出现不可用的情况。
但最近系统测试人员常反馈偶有Kafka消费者收不到消息的情况,登陆管理界面发现三个节点中有一个节点宕机挂掉了。但是按照高可用的理念,三个节点还有两个节点可用怎么就引起了整个集群的消费者都接收不到消息呢?
要解决这个问题,就要从Kafka的高可用实现开始讲起。
JBPM4_HIST_PROCINST流程实例历史表
JBPM4_HIST_TASK流程任务实例历史表
JBPM4_HIST_VAR流程变量( 上下文) 历史表
JPBM业务场景
首先进行请假的流程定义,我们流程的定义是(员工提交请假单—》经理审批—》总监审批—》总经理审批—》结束),通过repositoryService将其发布部署到jbpm4_lob表中,
之后获取流程定义列表,选中请假的流程定义,员工开始进行请假单的填写,保存并通过executionService开启流程实例,然后用taskService获取经理的待办任务列表,选中待办任务,进行审批,通过调用taskService.completeTask()进入到总监审批环节,然后用总监进行登录,同样获取待办任务列表,然后调用taskService.completeTask()进入总经理审批环节,总经理审批之后,结束流程。在这个过程中我们还可以根据historyService查看当前登录人已办的任务列表。
Ant描述
Ant是apache旗下的对项目进行自动打包、编译、部署的构建工具,他主要具有 轻量级并且跨平台的特性,而且基于jvm,默认文件名为build.xml
Ant主要的标签:
Project根标签,target任务标签,property属性标签,自定义键/值 供多次使用,java执行编译后的java文件,javac编译java文件,war打成war包,其它标签:copy,delete,mkdir,move,echo等。
FreeMarker描述
FreeMarker是一个用Java语言编写的模板引擎,它是基于模板来生成文本输出的通用工具。Freemarker可以生成HTML, XML,JSP或Java等多种文本输出。
工作原理:定义模板文件,嵌入数据源,通过模板显示准备的数据
(数据 + 模板 = 输出)
我们在使用模板中发现freemarker具有许多优点,它彻底的分离表现层和业务逻辑,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,所以使得开发过程中的人员分工更加明确,作为界面开发人员,只需专心创建HTML文件、图像以及Web页面的其他可视化方面,不用理会数据;而程序开发人员则专注于系统实现,负责为页面准备要显示的数据。
如果使用jsp来展示,开发阶段进行功能调适时,需要频繁的修改JSP,每次修改都要编译和转换,浪费了大量时间,FreeMarker模板技术不存在编译和转换的问题,在开发过程中,我们在不必在等待界面设计开发人员完成页面原型后再来开发程序。由此使用freemarker还可以大大提高开发效率。
webService描述
(主动说)
webservice是SOA(面向服务编程)的一种实现,主要是用来实现异构平台通信也就是不同平台不同项目之间的数据传输,从而避免了信息孤岛的问题,它之所以能够进行异构平台通信是因为它是完全基于xml的,所以说,webService是跨平台,跨语言,跨框架的,在java中通常有三种技术框架分别是xfire,cxf,axis2。
我们为了保证
webservice的安全性,采用了基于
WS-Security标准的安全验证(使用回调函数)。
(没必要主动说)
webservice的三要素分别是:
wsdl(webservice description language)用来描述发布的接口(服务)
soap(simple object access protocol)是xml和http的结合,是webservice数据通信的协议
uddi用来管理,查询webService的服务
(没必要主动说)
webservice的具体三种实现方式(框架)或者三种实现框架的区别
-
Axis2:可以用多种语言开发,是一个重量级框架,功能非常强大,但是它的性能比较低。
-
Xfire:它相比Axis2来说是一个轻量级框架,它的性能要比Axis2高。
-
cxf:是Xfire的升级版,就好比是,struts2是webwork的升级,然后cxf和spring集成起来非常方便,简易,性能方面也要比Xfire高。
【注】jdk6自带的webservice jws
(主动说)
业务场景
我在以前做项目的时候,其中遇到一个功能,需要进行两个项目之间的数据的传输,项目经理让我去完成这个任务,我根据以往的项目经验,想到两种解决方案,第一种就是开放另外一个项目的数据库的权限给我,然后我直接通过访问另外一个项目的数据库,来得到需要的信息,但后来我分析了下,觉的这种方式不安全,而且因为当时这个项目是另外一家公司负责在做,所以数据库里面的表结构,
以及以后牵涉
到的责任问题都很多,所以我就采用了第二种方案,即通过webservices的方式,进行异构系统之间数据信息的传递,webservices的具体实现,有xfire,cxf,axis2,我根据以往的项目经验,了解到cxf是xfire的升级版本,适用于java语言,xfire/cxf性能比axis2要高,并且和spring整合起来也比较方便,而axis2支持更多的语言,性能相对于cxf要低,通过上面分析,结合我们目前的两个项目都是基于java语言的,所以我采用cxf这种方式实现了两个项目之间数据的传递,我们为了保证webservice的安全性我们采用了基于WS-Security标准的安全验证(使用CXF回调函数)。
(没必要主动说)
webserv