我目前正在学习事件驱动的体系结构,并拥有以下两个微服务。
每当产品创建时,产品服务都会发布以下事件
订购服务使用这些消息并更新自己的本地产品数据存储。
事件的排序似乎非常重要,因为我不希望订购服务在产品实际创建之前使用ProductUpdatedEvent。
我一直在研究Azure服务总线,因为这可以保证订购,但是他们的最新产品,即专为事件驱动的体系结构设计的Azure事件网格,并不支持有保证的排序。
您应该只使用在微服务架构中支持FIFO的消息传递系统吗?
如果命令不能通过消息系统得到保证,那么如果这确实是一个问题,我们还能用什么方法来解决这个问题呢?
发布于 2018-06-09 16:20:35
决定订单是否重要取决于每个微型服务。在你的情况下,绝对是。上面的示例实际上很容易解决,因为如果OrderService在产品不存在时获得一个UpdateProduct事件,它可以将UpdateProduct事件重新放到队列中,前提是不久就会有一个创建事件。然而,两个UpdateProduct事件出现故障可能会导致问题,所以我们仍然需要解决这个问题。
有一些方法可以确保出版商和订阅者的订单,但它们很笨拙。如果Update事件包含产品的整个新状态,则可以添加时间戳,如果传入的时间戳比持久化时间戳旧,则拒绝更新缓存。如果updated只发送更新数据,则可以在聚合中添加一个递增版本号,如果传入的事件大于现有版本的1,则在中间事件即将到来的情况下请求该事件。正如你所看到的,这些都是笨拙的。你最好确保队列中的秩序。
您可以考虑Azure事件中心而不是Azure事件网格。事件集线器将保证在一个分区中的订单,所以明智地分区您的应用程序可以给您订单保证您需要。事件集线器的作用更像卡夫卡,而不是传统的队列,因为它提供了一个队列加上事件的持续时间很短的时间。如果系统崩溃并需要恢复,这可能是有利的。
发布于 2020-09-12 06:19:16
基于
收到的消息是:
{
id: 1,
timestamp: T2,
name: Samuel
}
{
id: 1,
timestamp: T1,
name: Sam,
age: 26
}
{
id: 1,
timestamp: T3,
name: Marlon Samuels,
contact: 123
}不管数据库中的顺序如何,我们希望看到的是:
{
id: 1,
timestamp: T3,
name: Marlon Samuels,
age: 26,
contact: 123
}对于每一条传入的消息,请执行以下操作:
现在让我们来看看下面的消息:
下面的deepMerge(src,目标值)应该能够给出结果:
public static JsonObject deepMerge(JsonObject source, JsonObject target) {
for (String key: source.keySet()) {
JsonElement srcValue = source.get(key);
if (!target.has(key)) { // add only when target doesn't have it already
target.add(key, srcValue);
} else {
// handle recursively according to the requirement
}
}
return target;
}如果您需要deepMerge()的完整版本,请在注释中告诉我
https://softwareengineering.stackexchange.com/questions/372285
复制相似问题