为什么80%的码农都做不了架构师?>>>   

在分布式系统下,可以很多种架构从事设计,或者分布式系统对技术架构本身没有做严格的限制。但是结合自己的实践以及基于《领域驱动设计》的推荐, 采用 【事件驱动模式】是比较好的一种分布式系统架构方式。该模式充分实现了 不同系统之间的代码解耦,所有的业务流转是通过事件广播进行驱动的。所有业务都是在针对 名为【事件总线】的组件在编程,也无需知道事件的生产者,每个业务只监听自己感兴趣的事件,然后根据事件触发不同的业务代码 以及 自己在处理完某种业务后,也对外广播发出事件,则标志着当前业务的完成。

基于【事件驱动模式】是一种比较接近人类自然行为的一种模式,该模式给系统的解耦以及重构带来了先天优势。相对比与传统的业务模式,大量的业务流程都是基于代码或者是某种规则引擎加以实现,而 事件驱动模式 则是针对事件总线注册监听, 【事件总线】总是能够忠实的把消息投递给感兴趣的监听者,并且保证其对应业务逻辑的自然触发。一旦有业务变动,我们仅仅是在【事件总线】上增加 或者 移除对应的事件消费者,或者注册新的事件发布者,这种行为并没有影响到当前的业务代码变动。 用日常通俗讲法:更加接近于  小学老师讲课,老师常常会不自觉的吼一声:“小朋友们,记住了吗?”这时,这要是听到该咨询的小朋友 都会回应道:“听懂了”,在此过程中 ,声音作为事件、空气作为事件总线(忠实的传递事件到达监听者),如果这个时候,小学的校长在教师边走过,那么老师的咨询同样也被校长听到,但是校长对此不作任何反应,应为该事件对于校长而言,是不关心的事件,所以直接忽略。还是忙他自己的事情。

引入事件驱动,让复杂的系统变得很容易,因为软件就是一直在模仿人类的神经传输,事件驱动是一种比较好的模仿行为。这个时候,大家会问,事件驱动,关键是事件的定义,以及在什么情况下发布事件呢?这个时候 就需要讨论的深入一点,事件是对一种业务行为完成的标识,只有当某一独立的原子业务执行完毕,就要对外发布事件。事件更多的需求术语为:当。。。。。。就该。。。。。。,类似的语境,恰好就是事件驱动完美的体现。  在方法的设计上,我们可以把方法拆分为 读方法 与 写方法,所谓的 读方法就是 该方法内部不对任何数据进行家修改,而是通过一个简单的叠加,组装,把数据有效的输出,而写方法恰好相反,写方法体现在对对象的修改上(并实现最终的持久化操作),所有的事件 是在 写方法中产生。这个以后作为单独的文章描述,为何如此设计呢?为了保证分布式下,数据的一致性等。

一旦引入事件驱动,则事件发布者永远不知道到底有多少消费者在监听该事件,而且当消费者收到事件后,是否正确的处理完其对应的业务,还是中途发生异常呢?事件的驱动是 采用同步方式还是异步方式呢?这就是引入【事件驱动】后,先天不足的一面,所以我们需要在架构上考虑这种不足,通过其他的技术手段来消除这种不足,从而变得稳定可靠。 这样就引出了本文另外一个 所要讲述的话题:长时间过程处理过程的方案,该方案的提出,就是为了解决事件驱动模式下,事件生产者与消费者 在互相不知道对方存在的情况下,而有效的协调完成一个更加的业务呢?

长时间过程处理(业务有专门的术语 称之为 Saga),通过个人的整理以及自己的理解,针对长时间过程处理 一般分为三种解决方案,通过技术手段使得【事件驱动模式】能够更好的为我们服务,三种方案分别如下:

1、把处理过程设计成为一个组合任务,使用一个执行组件对任务进行跟踪,并且对每一个步骤和任务的完成情况进行存储(持久化),然后再根据执行的结果决定是否启动下一个业务环节。该方案更像是责任链模式的灵活应用,缺点是 一开始就需要把该事件 可能触发的子任务进行备案,并对其执行结果进行登记注册,显然,这种方式适合于业务场景比较固定的情况。

2、同第一种方案类似,同样把处理过程设计为一个聚合,聚合成为活动协作的中心,一个或者多个聚合的实例充当之心任务的组件并维护过程中产生的异常等

3、第三种是设计一种 无状态的事件跟踪器,该跟踪器每一个事件的消费者的事件获取与执行情况,并且把执行结果反馈给跟踪器,该跟踪器获取结果后对其进行存储,这样不断的累加事件在消费过程中不断增加的处理结果,这样可以跟踪到事件流转的全部状态,并且按照存储的事件结果,决定是否正常执行完其一个完整的业务,该方案适合于消费者动态的场合,每一次事件的发布,都可以保证到期监听者对事件的消费以及结果的持有,只有当所有事件的状态是正常的,才能确定这个业务是完整的。

三种方案,第二种对代码的耦合度比较大,不建议使用,但是第二种方案是传统编程下最常采用的一种模式。  本人比较倾向于使用 第三种方案, 该方案如同人类神经网络一样,复杂而各司其职。

如果大家要体验这种机制,单机模式 推荐采用 guava 自带的 eventbus作为模拟的事件总线

如果是分布式模式 可考虑引入MQ 中间件作为消息总线。(事件更多的是应用为 P/S) 模式。

另外需要提出的一点是:事件内容能的设计,出了基本类型 就是基本类型,所有的业务事件数据都应当为 某种字符串的展现,如XML、JSON等。。。。。。   另外,事件的发出是有顺序的,这一点也需要引起注意。。。。。

2016年 开年过的有点 纲目不清,还是需要自己多反省,借用王守仁的 心学 “需要在事上下功夫,遇事多磨练自己的内心”。。。。。。

转载于:https://my.oschina.net/qfhxj/blog/625021

#分布式系统架构之# 事件驱动模式以及与之匹配的长时间处理过程讨论相关推荐

  1. 分布式系统架构设计三十六式之服务治理 - 第一式 - 隔板模式

    导读 日拱一卒,功不唐捐,分享是最好的学习,一个知识领域里的 "道 法 术 器" 这四个境界需要从 微观.中观以及宏观 三个角度来把握.微观是实践,中观讲套路,宏观靠领悟.本系列文 ...

  2. Serverless:微服务架构的终极模式(文末赠书)

    微服务的生态和实践已经比较成熟,其设计方法.开发框架.CI/CD工具.基础设施管理工具等,都可以帮助企业顺利实施微服务.然而,微服务远没有达到完美,它在架构.开发.基础设施方面仍然面临新的挑战. 微服 ...

  3. 针对架构设计的几个痛点,我总结出的架构原则和模式

    本文作者介绍了架构设计的原则以及什么是架构,并分析了4种常用的软件架构模式,分别是分层架构.事件驱动架构.微内核架构和微服务架构.点击阅读原文可查看完整PPT. 分层架构 分层架构是最常见的架构,也被 ...

  4. 分布式系统架构与云原生—阿里云《云原生架构白皮书》导读

    -点击领取<云原生架构白皮书>- 导语: 有幸作为阿里云MVP提前获得了阿里云云原生团队编写的<云原生架构白皮书>,希望通过自己对于云原生的理解为开发者提供一篇观后感或者是能够 ...

  5. 微服务架构的终极模式?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 微服务的生态和实 ...

  6. Serverless:微服务架构的终极模式

    微服务的生态和实践已经比较成熟,其设计方法.开发框架.CI/CD工具.基础设施管理工具等,都可以帮助企业顺利实施微服务.然而,微服务远没有达到完美,它在架构.开发.基础设施方面仍然面临新的挑战. 微服 ...

  7. 从Elasticsearch来看分布式系统架构设计,真是666~

    欢迎关注方志朋的博客,回复"666"获面试宝典 分布式系统类型多,涉及面非常广,不同类型的系统有不同的特点,批量计算和实时计算就差别非常大.这篇文章中,重点会讨论下分布式数据系统的 ...

  8. 千万级流量的大型分布式系统架构设计

    本文是学习大型分布式网站架构的技术总结.对架构一个高性能.高可用.可伸缩及可扩展的分布式网站进行了概要性描述,并给出一个架构参考.文中一部分为读书笔记,一部分是个人经验总结,对大型分布式网站架构有较好 ...

  9. 照抄不翻车:抗住千万流量的大型分布式系统架构设计

    作者介绍 烂猪皮,十余年工作经验,曾在 Google 等外企工作过几年,精通 Java.分布式架构.微服务架构以及数据库,最近正在研究大数据以及区块链,希望能突破到更高的境界. 本文是学习大型分布式网 ...

最新文章

  1. 利用pmap查看进程的地址空间
  2. 差分约束系统之Bellman_Ford与Spfa判断负权回路
  3. python caffe 训练自己的模型_python接口调用已训练好的caffe模型测试分类方法
  4. 2021中国新消费品牌社媒营销研究报告
  5. Python算法(含源代码下载)
  6. oracle导出导入数据库
  7. Android Studio 设置主题及字体
  8. PCB分析神器,一键找出Bug
  9. 基于深度学习的车型识别APP
  10. 如何去掉input type=file中的选择文件
  11. OPNsense防火墙搭建实验环境,MSF与SSH进行流量转发
  12. linux延迟加载so,WebRTC Linux ADM 实现中的符号延迟加载机制
  13. 文本情感倾向分析——机器学习模型
  14. 开源论坛框架调研总结
  15. 艾美智能影库服务器ip,艾美影库 篇一:艾美影库 | 精评丨性能与资源可兼得 艾美MS-200 高清影库...
  16. 【开发工具】Office Tool Plus 安装 Office
  17. 网易为什么成门户唯一常青树?从几个产品说起
  18. nRF52832之硬件I2C
  19. vue 关闭vue项目中烦死人的ESlint
  20. 为什么索引会加快查询速度?索引原理和使用原则

热门文章

  1. 远程ykvm 插件移值java_远程管理KVM,命令行控制KVM,console连接,透传
  2. 变焦什么意思_变焦镜头中的恒定光圈与浮动光圈是什么意思?萌新摄影分享指南!...
  3. axios 全局配置
  4. opencv 直方图投影
  5. Pandas 文本数据方法 strip( ) lstrip( ) rstrip( )
  6. Excel删除重复数据
  7. linux多进程介绍和示例
  8. 顺丰不行了吗?对快递行业的深度理解
  9. vSAN其实很简单-vSAN 原厂支持的包含范围
  10. Mysql学习总结(58)——深入理解Mysql的四种隔离级别