简单的事件驱动设计

总览

开发人员经常询问系统或其代码的性能或效率。 这到底是什么意思?

  • 我的代码是如此高效,只有编码神能理解它的工作原理。
  • 我的代码确实很聪明,但是却难以维护。 下一位开发人员将继续重写它。
  • 我的代码对机器确实很有效,但对开发人员却没有效率。
  • 我的代码很容易理解,这意味着开发人员会更高效,并且代码不仅足够快而且容易修复(如果没有的话)。

因此,与其问自己可以编写代码有多快以及可以放入多少技巧,不如问自己。 我能做到多简单,而且速度还不够快?

简单的事件处理。

对我来说,最简单的事件处理是不返回任何内容的方法调用。 这很容易转换为异步消息传递,例如

public interface EventProcessor {void event(MyEventData data);void eventTwo(MyEventData2 data);
}

这非常简单,一个组件通过调用方法来产生事件,另一个组件通过提供实现来消耗或处理该事件。

有多简单?

您可以使用一个按钮从调试器中的生产者组件升级到消费者组件。

与生产者(调用您的消费者)建立单元测试需要两行代码。

MyConsumer mc = new MyEventProcessor();
MyProducer mp = new MyProducer(mc);

您可以使用任何模拟工具模拟事件处理器,并检查生产者是否创建了您期望的事件。 您可以通过在单元测试中调用使用者上的方法来模拟生产者。

效果如何?

您可能会认为这几乎没有开销,一个组件只调用另一个。 但是,即使方法调用也有开销,这就是JIT支持内联的原因。 这可能意味着开销是名义上的,甚至比方法一起优化时的开销要少(即,这可能比两种方法的总和要快得多)

我想念什么吗?

实际上确实有很多遗漏,但与业务需求无关;

  • 运输工具。
  • 监控
  • 序列化
  • 故障转移
  • 服务发现
  • 安全

这些是单独的问题,通常不是应用程序本质复杂性的一部分。

我可以使用什么交通工具?

有太多选择,不可能知道将来所有情况下都适用。 因此,运输的选择(或缺乏运输)应为配置详细信息。 设计的唯一基本部分应该是可以轻松更换运输装置,而不必触碰您的业务逻辑。

运输的一个例子?

低延迟,高吞吐量的解决方案是使用Chronicle Queue。 重复自己; 您只需要在合理的情况下使用它,否则就可以使用任何其他交通工具。

编年史队列做什么?

  • 保留每条消息的重播功能并检查错误修复。
  • 低延迟序列化,支持模式更改,并具有可读性以进行验证
  • 记录和监视。

最后一点很重要。 如果您已经坚持了组件要执行的每个动作以及每个状态都发生了变化,则在正常操作中不需要任何其他日志记录。 任何下游组件都可以重新创建其感兴趣的状态,而无需接触产生该信息的组件。

编年史队列如何做到这一点?

编年史队列使用两个组件;

  • 实现您的界面的作家。 每个方法调用都会写入一条消息。
  • 一个读取器,调用您的接口的实现。 每个消息都调用相应的方法。

注意:这种策略几乎可以用于任何运输。 编年史队列为您提供的是低延迟记录或用于重播和替换日志的所有消息。

这一切表现如何?

如果您使用诸如YAML,Binary YAML或JSON之类的灵活序列化,并且您的组件没有做太多事情,那么您可以期望获得每秒约100,000条消息的吞吐量,而无需进行大量调整。 如果使用较低级别的二进制协议,短消息和多个线程,则每秒可以获得超过1000万条消息。

您可以选择免费使用所有这些GC,但这会使您的设计复杂化,因此很可能会产生一些垃圾,但是您可以选择根据需要减少垃圾。

其他值得注意的交通工具。

Aeron是一种基于UDP的低延迟传输。

Chronicle Queue Enterprise支持通过TCP进行复制和远程访问。

Chronicle Websocket Jetty支持通过websocket访问JSON,消息速率约为100K / s

结论

您应该开始设计和测试,着重于实际需要的关键组件。 您应该允许您的设计适用于任何运输方式,并可以选择用一种替代另一种。

在单元测试和调试中,不进行传输以表明组件仍可以以最小的复杂度运行是很有用的。

我们能帮你什么吗?

Chronicle Software在现场研讨会上运行了一个星期,我们会训练/指导您的团队使用这些设计方法来构建原型系统。 解决方案的选择取决于您,因此这可能是启动新项目并进行培训的好方法,这将立即有用。 有关更多详细信息,请联系sales@chronicle.software 。

翻译自: https://www.javacodegeeks.com/2016/03/simple-event-driven-design.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51Nod 1105 第K大的数 二分答案

很典型的二分答案的题目 码着 #include<iostream> #include<algorithm> #include<string> #include<string.h> typedef long long ll; using namespace std; const int MAX 5e4 5; ll n, k, a[MAX], b[MAX]; bool C(ll mid) {ll j n, cnt 0;for …

带有JWT示例的​​Spring Oauth2

有时以前&#xff0c;我们发表了一篇文章&#xff0c;分享了一种在云环境中实现无状态会话的自定义方法。 今天&#xff0c;让我们探讨为Spring Boot应用程序设置Oauth2身份验证的另一个流行用例。 在此示例中&#xff0c;我们将使用JSON Web令牌&#xff08;JWT&#xff09;作…

Spring源码解析-实例化bean对象

spring加载配置文件&#xff0c;AbstractApplicationContext类中的refresh方法起着重要的作用。 Overridepublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.准备刷新…

java docx文档解析_带有docx4j的Java Word(.docx)文档

java docx文档解析几个月前&#xff0c;我需要创建一个包含许多表和段落的动态Word文档。 过去&#xff0c;我曾使用POI来实现此目的&#xff0c;但是我发现它很难使用&#xff0c;并且在创建更复杂的文档时对我来说效果不佳。 因此&#xff0c;对于这个项目&#xff0c;经过一…

Win8.1部署 .NET Framework 3.5 安装方式

Windows 8.1中包含.NET Framework&#xff0c;操作系统安装过程中默认安装 .NET Framework 4.5.1。如果程序需要.NET Framework 3.5支持&#xff0c;将自动启用相关功能。 注意&#xff1a; 1. .NET Framework 3.5同时支持基于 .NET Framework 2.0/3.0/3.5构建应用程序。 2. 在…

@Autowired所有的东西!

最近&#xff0c;我写了Autowired注释 &#xff0c;它使我们可以编写更少的代码&#xff0c;从而使我们的生活更轻松 。 但是&#xff0c;使用它通常会使您的设计更加复杂。 尤其是当我们谈论在类的属性上使用它时。 它更容易违反 单一责任原则 。 这样可以更容易地注意到这一…

Python基础-闭包

闭包&#xff1a;闭包内部函数定义函数时的环境 def outer():x 10def inner(): # 条件一 inner就是内部函数print(x) # 条件二 外部环境的一个变量return inner # 结论 内部函数inner就是一个闭包 outer()() 转载于:https://www.cnblogs.com/fansik/p/7676231.html

jit即时编译_热点中的即时编译器(JIT)

jit即时编译即时编译器&#xff08;JIT&#xff09;的概念以及更广泛的自适应优化是除Java&#xff08;.Net&#xff0c;Lua&#xff0c;JRuby&#xff09;之外的许多语言中众所周知的概念。 为了解释什么是JIT编译器&#xff0c;我想先定义一个编译器概念。 根据维基百科&…

每天十分钟系列:JS数据操作之神奇的map()

Array.prototype.map() map()方法可以创建一个新数组&#xff0c;其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。 demo1 上面的例子&#xff0c;在控制台中打印的结果是&#xff1a; 1 2 3 4 5 demo2 javascript学习交流群&#xff1a;453833554 上面的例子…

JSON格式数据与数据组件

1.将JSON格式数据转化为wex5data数据组件中的数据&#xff0c;且数据列数不必一 一对应&#xff0c;但转化的列数据的列名与数据表字段相同。 Model.prototype.goodsDataCustomRefresh function(event){var url require.toUrl("./json/goodsData.json");$.ajaxSett…

作业十三

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>GZCC</title> </head> <body> <h1>MIS问答平台</h1> <h2 id"2015">2015</h2> <div id&quo…

openshift_通过OpenShift超越云炒作

openshift您是否厌倦了为应用程序请求新的开发机器&#xff1f; 您是否为必须为应用程序设置新的测试环境感到烦恼&#xff1f; 您是否只想专注于和平开发应用程序而不会一直“沉迷于堆栈”&#xff1f; 我们听到你的声音。 我们也去过那里。 不用担心&#xff0c;OpenShift就在…

初级程序员需要接触好的架构代码

最近感触最深的就是一个项目需要好的架构设计&#xff0c;不会因为后面不断延伸业务需求造成业务代码的不断堆砌&#xff0c;破坏整个项目的层次结构&#xff0c;也让新来的团队成员更好的上手项目&#xff0c;从清晰的结构就能很快的了解整个业务的流程。一个好的架构设计&…

行动中的反思实践

在上一篇文章中 &#xff0c;我解释了最基本的敏捷实践是反思。 在本文中&#xff0c;我概述了组织&#xff0c;团队和人员如何在行动中运用反思的示例。 通过回顾反思 回顾是强大的工具&#xff0c;整个团队都可以使用它们来反思其当前的工作实践&#xff0c;以了解他们为持续…

python基本语法1.2--数的移位及与或抑或相关计算

#便于中文的显示# -*- coding: utf-8 -*- #指数表示 # a ** b <> power(a, b) print(10 ** 2) #100 print(10 ** 2.5) #316.22776601683796 #做除法 # //: 返回商的整数部分 print(23 // 5) #4 print(28.7 // 4.4) #6.0#<<向左移位做乘法#>>向右移位做除法 …

fabric canvas 清空并重置画布

fabric.js是一个强大而简约的依赖HTML5上的 canvas的javascript库&#xff0c;Fabric在canvas元素顶部提供了交互式对象模型&#xff0c;它还具有SVG到画布&#xff08;和画布到SVG&#xff09;解析器&#xff0c;官网上提供了丰富的案例&#xff0c;可照葫芦画瓢&#xff0c;足…

使用vue-axios请求geoJson数据报错的问题

最近的项目用到了echarts一个带有散点地图的图表,按照正常jquery写法应该使用ajax请求geojson的数据动态去切换地图,就像下面这样 $.get(Js/map/ cityData.name .json, function(geoJson) {map(gr-map, cityData, geoJson, geoCoordMap);//调用地图方法}); 页面显示(成功) bu…

前端工业物联网开发(Electron + Typescript + Vue)

从SpaceX公司的带来的Javascript上天新闻开始&#xff0c;以及近几年js语言在整个互联网的广泛应用&#xff0c;注定未来js语言有着不平凡的使命&#xff0c;跨端&#xff08;一套代码多端运行&#xff09;、易UI&#xff08;前端开发UI的便利&#xff09;、丰富的生态&#xf…

JAVA记录-Servlet介绍

1.什么是Servlet Servlet是sun公司提供的一门用于开发动态web资源的技术。Sun公司在其API中提供了一个servlet接口&#xff0c;用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据)&#xff0c;需要完成以下2个步骤&#xff1a;1、编写一个Java类&#xff0c;实现…

前端jenkins打包编译发布项目流程

如今的前端项目已不像之前直接写完代码&#xff0c;扔到服务器直接运行了。免不了安装依赖&#xff0c;执行build过程&#xff0c;然后再将打包后的代码上传到服务器&#xff0c;可能还需要更改配置文件啥的。如此多的步骤严重影响开发的日常划水时间。所以jenkins自动化部署少…