作为最近的跟进使用变更数据捕获和流处理构建审计日志文章中,我们想用管理特性扩展这个示例,以便能够捕获和修复任何丢失的事务数据。

在上面提到的博客文章中,有一个日志丰富器服务用于将在Vegetable数据库表中插入或更新的数据与事务上下文数据结合起来,例如开云体育电动老虎机

  • 事务id

  • 执行该工作的用户名

  • 实际变更背后的用例。“创建蔬菜”

只要所有的变化都是通过蔬菜服务来完成的,这一切都很好。但情况总是这样吗?

那么直接在数据库级别上执行的维护活动或迁移脚本呢?开云体育电动老虎机现在仍然有很多这样的活动在进行,或者是故意的,或者是因为那是我们试图改变的旧习惯……

数据库级维护开云体育电动老虎机

因此,让我们假设需要对库存数据库进行一些维护,这基本上会对存储在蔬菜表中的数据进行更改。开云体育电动老虎机为了简单起见,让我们在蔬菜表中添加一个新条目:

插入库存。蔬菜(id、名称、描述)106黄瓜,优秀的);

一旦添加了这个,您将看到日志丰富器服务开始打印相当多的日志消息……并且它不断地这样做。

log-enricher_1 | 2019年10月11日10:30:46,099 INFO [io.deb.dem.aud.enr.ChangeEventEnricher] (auditlog-enricher-c9e5d1bb-d953-42b4-8dc6-bbc328f5344f-StreamThread-1) Processing buffer change event for key {"id":106} log-enricher_1 | 2019年10月11日10:30:46,106 WARN [io. deb.dem4 .aud.enr. changeeventenricher] (auditlog-enricher-c9e5d1bb-d953-42b4-8dc6-bbc328f5344f-StreamThread-1) No metadata found for transaction {"transaction_id":611} log-enricher_1 | 2019年10月11日10:30:46,411 INFO[io.deb.dem.aud.enr.ChangeEventEnricher] (auditlog-enricher-c9e5d1bb-d953-42b4-8dc6-bbc328f5344f- streamthread1)处理密钥的缓冲更改事件{"id":106} log-enricher_1 | 2019年10月11日10:30:46,415警告[io.deb.dem.aud.enr.ChangeEventEnricher] (auditlog-enricher-c9e5d1bb-d953-42b4-8dc6-bbc328f5344f- streamthread1)没有为事务找到元数据{"transaction_id":611} log-enricher_1 | 2019年10月11日10:30:46,921 INFO [io.deb.dem.aud.enr.ChangeEventEnricher](auditlog- rich -c9e5d1bb-d953-42b4-8dc6-bbc328f5344f- streamthread -1)处理key {"id":106}的缓冲更改事件

查看日志,您可以确定它实际上指的是我们刚刚插入的条目(id 106)。除此之外,它还引用它无法找到的丢失的事务上下文数据。这就是在数据库层面手工操作而不是通过蔬菜服务的结果。开云体育电动老虎机中没有对应的数据dbserver1.inventory.transaction_context_dataKafka主题和日志充实器不能相互关联,并通过合并/充实它们。

Kogito来拯救

如果我们能有某种管理服务来帮助解决这类问题,那将是一个非常好的功能(或者像Gunnar所说的一个整洁的功能)。主要是因为如果添加了这样的条目,它将阻止整个浓缩活动,因为第一个缺失的消息将阻碍所有其他消息。

来了Kogito-云原生业务自动化工具包,基于战斗测试能力构建智能业务应用程序。换句话说,它带来了解决特定业务问题的业务流程和规则。在这种情况下,业务问题是阻塞日志充实,这可能导致一些(各种类型的)机会的丢失。

Kogito帮助我们的是定义我们的逻辑,以理解哪里可能出错,需要做什么来解决它,以及可以导致问题和解决方案的条件是什么。

在这个特殊情况下,我们使用流程和规则来确保获得正确的上下文,并对蔬菜服务背后的事件做出反应。为了能够发现错误的情况,我们需要监控两个主题:

  • dbserver1.inventory.vegetable-蔬菜数据变更事件

  • dbserver1.inventory.transaction_context_data-来自蔬菜服务的事件,带有额外的上下文数据

为此,我们定义了两个业务流程,每个流程都将基于来自单独Kafka主题的传入消息启动:

蔬菜事件过程定义
事务上下文数据流程定义

如上所述,这两个流程都是基于传入消息启动的。之后的逻辑就完全不同了。

“事务上下文数据”流程只负责检索事件并将其推入处理阶段——这本质上意味着将其插入用于规则评估的所谓“工作内存”中。在那一刻,一切都结束了。

“Vegetable事件”进程以类似的方式启动……它检索消息,然后(首先以与日志丰富器服务相同的方式忽略快照消息)等待预定义的时间(2秒),然后匹配Vegetable和事务上下文事件。一旦有一个匹配,它将简单地完成它的执行。但是如果没有找到匹配项,它将创建一个用户任务(这是一个需要人工参与者在流程继续前进之前提供数据的任务)。

这是通过管理用户界面(http://localhost:8085/),可以很容易地发现这样的实例,并对它们进行处理,以修复缺失的数据。

用于修复缺少的事务上下文数据的管理服务UI

一旦用例而且用户名属性,进程将创建一个新的事务上下文事件,将其推送到Kafka主题并完成自身。

在将丢失的事务上下文数据事件放在主题上之后,日志充实器将恢复其操作,您将能够在日志中看到以下行:

log-enricher_1 | 2019年10月11日10:31:00,385 INFO [io.deb.dem.aud.enr.ChangeEventEnricher] (auditlog-enricher-c9e5d1bb-d953-42b4-8dc6-bbc328f5344f- streamthread1)处理密钥的缓冲更改事件{"id":106} log-enricher_1 | 2019年10月11日10:31:00,389 INFO [io.deb.dem.aud.enr.ChangeEventEnricher] (auditlog-enricher-c9e5d1bb-d953-42b4-8dc6-bbc328f5344f- streamthread1)密钥的丰富更改事件{"id":106}

有了它,您可以轻松地管理审计日志,以确保任何错误情况都能迅速解决,而不会影响任何其他活动。

如果你想看所有的动作,就看这个视频吧:

或者通过运行审计日志示例

Maciej Swiderski

Maciej是Red Hat的软件工程师,他领导着jBPM项目,同时也是Kogito项目的联合创始人。


关于Debe开云体育官方注册网址zium

开云体育官方注册网址Debezium是一个开源的分布式平台,它将现有数据库转换为事件流,因此应用程序几乎可以立即看到并响应数据库中提交的每一个行级更改。开云体育电动老虎机开云体育官方注册网址Debezium是建立在卡夫卡并提供卡夫卡连接监控特定数据库管理系统的兼容连接器。开云体育电动老虎机开云体育官方注册网址Debezium在Kafka日志中记录了数据更改的历史,所以你的应用程序可以在任何时候停止和重新启动,并且可以很容易地使用它没有运行时错过的所有事件,确保所有事件都被正确和完整地处理。开云体育官方注册网址Debezium是开源Apache许可证,版本2.0

参与

我们希望您觉得Debezium有趣开云体育官方注册网址且有用,并愿意尝试一下。在Twitter上关注我们@开云体育官方注册网址debezium在Zulip上和我们聊天,或加入我们的邮件列表与社区对话。所有的代码都是开源的GitHub上,因此在本地构建代码并帮助我们改进现有连接器并添加更多连接器。如果您发现了问题或对我们如何改进Debezium有想法,请告诉我们开云体育官方注册网址记录问题

Baidu
map