问题标签 [outbox-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
202 浏览

microservices - 将 SAGA 模式与同步 HTTP 请求一起使用

我想了解 Saga Pattern 使用编排是如何工作的。

在我发现的所有参考资料中,似乎每个步骤都需要使用异步通信进行通信,例如队列或事件流集线器。

我在想是否真的有必要在每个步骤之间使用异步通信,或者我可以使用 Http 同步来保证每个步骤都是幂等的?

例如

我收到一个存储在队列或事件流中心(如 Kafka)中的 http 请求。然后是单个消费者,消费消息并执行一系列同步幂等步骤,就像 SAGA 编排机制一样。如果其中一个步骤失败,消息最终将被重新处理,所以我可以补偿一个步骤,如果它失败了。

0 投票
1 回答
69 浏览

microservices - QLDB 是否与发件箱模式兼容?

我有一个 QLDB 最有意义的用例。我还认为发件箱模式对数据可靠性很有意义。但是,我担心发件箱条目会污染期刊。

我的理解是,虽然我可以将“发件箱”表与主数据表分开,但日记帐在整个分类帐中共享。似乎发件箱模式传统上使用关系数据库,其中不可变日志的概念不是问题。

随着数据集的增长,这会成为一个问题吗?更重要的是,是否有一种更有意义的替代模式?

0 投票
1 回答
191 浏览

azure - 向事件中心发送有关成功插入数据库的事件时如何确保可靠发布?

语境:

  1. 在带有 EventHubTrigger 的 Azure 函数中,我保存了从已处理事件映射到数据库的数据(通过实体框架)。此动作同步执行
  2. 使用事件中心生产者触发有关成功插入数据的新事件。此操作是异步的
  3. 在其他地方处理触发的事件

我想在保存数据期间可能会发生某些事情失败,所以我想知道如何防止不一致并确保如果不应该发送事件则不会发送。据我所知,Azure 事件中心还没有实现发件箱模式,所以我想我需要以某种方式模仿它。

我还在考虑替代且有点臭的解决方案,以使此发布事件方法在步骤 2 中同步(即使事件驱动的性质是异步的)并在步骤 1 和步骤 2 之间添加附加检查 - 使确保所有内容都保存在数据库中。只有满足该条件,才会触发事件(步骤 3)。

有什么建议吗?

0 投票
1 回答
107 浏览

.net-core - 在 CosmosDB 中保留 NServiceBus Outbox 文档记录 7 天的意义

根据 NServiceBus Azure Cosmos DB 持久性文档,发件箱重复数据删除数据默认保留 7 天。但是,对于大容量事务数据库,这可以轻松地在一天内添加数百个发件箱文档。我知道我们可以更改默认设置以减少发件箱ttl。但是,在此之前,我想了解以下内容:

  • 在 Cosmos DB 中将发件箱文档保留 7 天有什么意义?
  • ttl将发件箱文档的时间缩短到 4 天会有什么影响?这是否意味着如果一条消息失败了,它只能在接下来的 4 天内恢复?如果是,有没有办法为立即成功的交易清理发件箱记录?
0 投票
1 回答
53 浏览

asp.net-core - 如何在 Asp.net 核心控制器中获取 MassTransit ConversationId 而不发送任何消息?

在 ASP.NET Core 控制器中,我有一个创建消息和修改数据库的操作。为了让它更可靠,它使用我们实现的发件箱模式将消息序列化到数据库。

问题是我们在ConversationId将 MassTransit 保存到数据库时丢失了来自 MassTransit 的消息,我没有找到将其从IPublishEndpoint界面中取出的方法。

任何建议如何获得ConversationId

这些消息只是没有任何特殊接口的任何 c# 类。

0 投票
2 回答
609 浏览

mongodb - 是否可以仅为 RabbitMQ 发布失败场景实现事务发件箱模式

我有一个使用 mongoDB 作为持久性和 RabbitMQ 作为消息代理的系统。我有一个挑战,我只想为 RabbitMQ 发布失败场景实现事务发件箱。我不确定这是否可能,因为我也有使用相同 mongoDB 持久性的消费者,所以当我编写涵盖 RabbitMQ 发布失败场景的事务发件箱的代码时,发布的消息在 mongoDB commitTransaction 之前到达消费者,所以我的消费者不能由于延迟,无法在 mongoDB 中找到消息。

我的代码如下所示;

1-开始会话事务

2-插入带有会话的文档(因此在我调用提交之前它不会持续存在)

3-发布rabbitMQ

4- 如果成功 commitTransaction

5-如果错误插入到带有会话的发件箱文档中而不是 commitTransaction

6-如果 mongoDB abortTransaction 出现问题(如果发布成功且 mongoDB 失败,我的消费者首先检查 mongoDB 是否存在,如果不存在则不执行任何操作。)

所以问题在于消息在 mongoDB 持久性之前到达消费者,你有什么解决方案可以解决我的问题吗?

0 投票
0 回答
61 浏览

google-cloud-pubsub - Debezium 服务器并启用 Jaeger 跟踪

我正在尝试使用 Jaeger 和 Debezium Server 启用跟踪,但我无法找到任何文档来解释如何执行此操作。有很多使用 Kafka 连接器的示例,但很少有使用服务器的文档。

我正在使用发件箱模式将事件发布到 GCP (Google) PubSub,并且端到端跟踪事件会很好。有没有人可以向我指出任何说明如何启用跟踪的文档或示例?最好查看显示通过 .properties 文件或环境变量可用的所有配置选项的文档。

0 投票
0 回答
118 浏览

multithreading - 发件箱图案弹簧卡夫卡

我有一份将发件箱表(在 mysql DB 中)中的事件发布到 kafka 的工作。我正在使用弹簧卡夫卡。我有从发件箱表中读取记录、创建执行程序线程并将发件箱表中的行在多个线程之间划分并发布事件的代码。我想发送两种类型的事件,一种是 avro,另一种是 json,如果两种发送都成功,我想从表中删除记录。我希望这段代码以异步方式运行。

获取事件、在线程之间划分和运行线程的代码

代码在每个线程上运行,即在kafka中产生两种类型的事件(avro和json)

现在你可以看到我以异步方式发布事件,在发布任何一个(avro 或 json)时,我将发件箱实体中的计数增加到 1,如果它已经是 1,我将记录删除为已经是一种类型的事件,即。 e avro 或 json 已发布,这是第二个事件。所以通过这种方式,我可以确保我已经发布了这两个事件。现在我不确定这将如何在多线程环境中工作。这是正确的方法吗?

0 投票
1 回答
77 浏览

java - Quarkus outbox pattern with Debezium: how to add a custom column to outbox table

I am using Debezium for implementing outbox pattern on Quarkus (v 2.3.0 Final) and it works fine! I added a custom string column to my outbox table (on a Postgres DB) but when I call event.fire, the string value is not persisted. I have found this property table.fields.additional.placement in Debezium configuration but I can not understand how to use it in Quarkus application.properties. Is there anyone able to help me? Thanks in advance

0 投票
0 回答
30 浏览

saga - 事务性发件箱生命周期

据我所知,实现 saga 编排的最佳模式之一是发件箱。这个问题显然想讨论发件箱表的生命周期。我可以在一段时间内从表中删除通过的记录,还是应该保留它们以展示交易流程?如果我们长时间不删除记录,表的重量是否会破坏CDC进程?我知道这个过程取决于数据库架构和类型。因此,您认为我们的用例是 go 应用程序使用的 mongodb。