您好,哈布罗夫斯克市民! 在这篇文章中,我们想分享对
Joker 2018 Java开发人员会议的印象,我们从听到的内容中最记得这个会议。
我们希望当视频出现在公共领域时,可以帮助您浏览会议中的视频。 同时,我们尽可能地添加了指向演示文稿的链接。

第一天
运行,别走开复杂性-Venkat Subramaniam
敏捷是适应变化的能力。 我们自己创建的系统复杂性阻止了有效地使用敏捷。
Venkat的报告列出了使演讲者的系统复杂化的问题清单以及有关软件开发的一般建议。 该报告不太可能是一个启示,但即使是显而易见的事情也需要知道,有时在内存中使用和刷新它们很有用。
我们如何使系统变得复杂:
- 活动部件
进行不必要的配置,创建未使用的组件,创建过多的图层等。 - 无法读取的代码
“此代码有效,但看起来似乎不应该。” 难以阅读代码会导致更改不可见。 不透明的更改会生成错误,并会干扰对对象正在发生的事情的理解。 - 依赖过多
依赖关系很快变得不兼容,存在的依赖关系越多,对其进行管理就越困难。 - 对新技术的鲁passion热情
尝试回答您的问题:
-引进新技术的价格是多少?
-放弃所选技术有多容易?
-库或框架? 您使用库,而框架“围绕着您”。 拒绝库要比框架容易得多。 因此,需要更仔细地决定使用该框架。 如果很容易返回到旧方法,并且我们可以证明这一点,那么我们就必须采用它。 不要下载您真正不需要的内容。
-恢复驱动的开发。 - 随机难度
例如,低级多线程。 如果您通过线程池解决了问题,那么现在您有了问题池。
事务级联,或如何构建事务微服务体系结构-Harald Wendel( 演示 )
Harald讲述了该项目如何通过删除交易并将其替换为State Machine来解决组织分布式交易的问题。 为了保持微服务之间的一致性,它们必须对包括残疾在内的条件实施支持,并应对其变化。 该项目使用Kafka在服务之间进行通信。
实际上,该报告有一个想法-在切换到分布式系统时放弃交易。
前一个交易操作的工作方式:
- 它仍然是事务性的,但是只有一个业务操作(有条件的一个)被提交给数据库。 事务中的其他人为Kafka保存一个数据库。
- 另外,作为交易的一部分,我们获得了新的州商业交易。 这是一个完全正确的独立状态。
- 特殊处理程序读取基础:如果处理程序与实体位于同一位置,则对实体进行轮询或提交钩子。 然后向Kafka发送消息。
- Kafka订户处理消息。 在这里,标准的交付保证机制对我们很有用。 邮件将在适当的时间在Kafka上发送,并将在某天由服务处理。
- 在处理期间,订户可以提交其数据库并更改其状态。 在这种情况下,服务交换状态。
- 回滚业务交易号 有三种用于处理问题的选项:
- 直到最后,等待来自Kafka的消息得到正确处理。
- 如果发生错误(以及所需的重复次数),它将转换为启动相应的“错误”状态。
- 向Kafka发送消息,以由业务交易发起方(和其他参与者)进行处理,以采取措施回滚其本地交易。
货架上的Java进程内存-Andrey Panguin
Andrey的报告可以通过非堆内存的示例用作本机内存泄漏的调试问题的参考和操作方法。
该报告对于了解谁和谁吃了内存很有用。 Andrei展示了用于分析内存的工具,其中包括内置于Idea中的AsyncProfiler:“即将推出的IntelliJ IDEA 2018.3集成了可以分析JVM和本机代码的低开销采样分析器-异步分析器。”
我们建议所有人观看它,并以相同的步骤运行其模块和微服务。
模式匹配和他的想象中的朋友-Tagir Valeev
Tagir讨论了编程语言的可能性:Java中出现什么,如何,何时,以何种方式出现拐杖,语言的开发人员和社区必须解决哪些问题。 几乎没有明显的实际适用性,但从长远来看可能很有用。
高级福尔摩斯和Junior Watson在软件开发世界中的冒险[Joker Edition]-Evgeny Borisov和Baruch Sadogursky( 演示 )
该报告的摘要已经很有趣。 Holmes和Watson承诺将解决日常开发中的几个难题:工具,库和框架,这些软件,库和框架会困扰普通开发人员的日常工作。
我们注意到了故事中最有用的要点:
- 在Spring 5中,您可以在外部Groovy文件中添加垃圾箱和其他Spring东西。 即 无需重建,只需重新启动即可,例如添加BeanPostProcessor。
- 您需要记住豆子的名称。 例如,您不能创建ConversionService bean,因为 这已经在春天的肠子里了。
- 您需要记住标准。 例如,multipart只允许发布,而Spring正在观看。
- 需要阅读文档。 让我们用一个例子来说明一下。 AllArgsConstructor为构造函数添加了java.beans.ConstructorProperties批注。 而且,如果没有注释,Jacson将使用默认的构造函数和getter,因为 编译后不会保存构造函数参数名称。 如果有注释,则会在参数中指示参数名称(根据Java bean约定),而Jacson使用构造函数; Lombok SneakyThrows注释将Checked异常更改为Unchecked异常。
- 该报告还提出了一个有趣的问题:“原则上我们是否需要Checked异常?” 我们以为。
第二天
反应性铁杆:如何构建发布者<?>-Oleg Dokuka
我们可以说这是对反应式编程的介绍:该报告描述了基本概念和抽象。 Oleg显示了推理的整个过程,这使我们可以从标准的Reactive Streams库中实施Publisher。 我们建议您看一下,以了解腿从何而来。
一小时内用Java从无到有的机器学习到生产-Derek Ferguson( 演示 )
如果您学习机器学习,可以听一听。 尽管不清楚该报告的目标读者。 如果人们理解了,那么对他们来说就不再有趣了。 如果他们不理解,那么该报告将不会被整理,信息太少了。
主要信息是:您可以使用Google TensorFlow从Java训练模型,但是训练支持有限。 但是您可以使用经过训练的模型。 例如,将经过训练的模型加载到TensorFlow微服务中,然后从Java或其他微服务发送请求以获取答案。 例如,识别一张图片,通过症状告诉自己,什么样的疾病...
TensorFlow团队还拥有一个带有TensorFlow的Docker映像,可用于在其中加载模型并发送使用这些模型的请求。 真好
Micronaut vs Spring Boot,还是谁最小? -Kirill Tolkachev和Maxim Gorelikov
Cyril和Maxim在启动速度,运行所需的内存量以及编码复杂度方面比较了现代框架。
有一个事实引起了我们的注意:Micronaut在编译时实现DI,而Spring在运行时/运行时实现。 这使Micronaut可以更快地启动。 但是在发布Micronaut的发行版本之前,必须先说一句话。
无功分配器ok.ru/音乐-瓦迪姆·哲塞( 演示 )
Vadim Tsesko讨论了Odnoklassniki中音乐发行商的体系结构。 该报告包含服务器及其角色的描述,平衡的描述以及如何提供容错和高可用性。 单独地-关于在没有特殊技术细节的情况下的反应式方法。 OK展示了使用反应性方法的有效示例。
提出了各种由于平衡和复制而获得容错服务的概念,最佳实践和体系结构,以及用于缓存数据以快速将数据传递给用户的其他技巧。 与往常一样,在演示文稿中,OK拥有许多链接,可从幻灯片中更深入地研究该主题。
活性弹簧-乔什·朗(Josh Long)
我们要去的报告:)其实不是,但是乔希·朗(Josh Long)是会议的两大明星之一。 他的报告很酷,融合了幽默和技术。
在实践中,我们所谓的报告是有关使用Spring WebFlux创建响应式微服务的实时编码会议。 它大致了解了Reactive API是什么,并提供了在Spring 5中使用的示例,并且好处是有趣的演示。 还有一个示例,其中有Reactive Proxy替代Zuul的方法。 我们建议大家看看。
世界终于变得被动起来了。 或小丑报告的整体印象
有很多关于此的报告,并且在讨论区域中进行了更多讨论。 实际上,最大的问题是世界是否已经变得被动起来,或者已经有这么长时间了,但是现在他们为旧模式想出了一个新名称,并为它们注入了新的血液。
关于反应性的报道中有各种各样的报道:纯粹是技术性的,例如乔什·朗(Josh Long),他讲了如何在春季进行反应。 以及实际使用反应性的案例-例如,来自Classmates的Vadim Tsesko。
我们的主要技术是Spring,因此我们认为Josh Long报告是必看的。 (
从报告链接到存储库 )。 有一个示例服务,它与Mongo进行反应,而一个反应服务则作为另一个代理服务。 这对于我们找出来非常有用。