如何处理数据复制滞后和事件通知

How to handle data replication lag and event notification

我们有一个简单的应用程序,它在每次实体更新时向 SNS 发送通知(它很可能是任何其他排队系统)。客户正在收听这些通知,他们根据这些通知获取更新的实体。

我们面临的问题是,当客户端执行 get 操作时,有时数据未被复制,我们 return 404 或有时过时的数据(甚至更糟)。

我们如何在发送通知时缓解这种情况?

这里有一些缓解这种情况的策略,有利有弊

  1. 不是从应用程序发送通知,而是使用数据库流发送通知

    例如 dynamodb 流 ans aws lambda。这种模式在多区域部署的情况下也很有用。所有订阅者,发布者都将订阅他们的区域数据库流。并且还保留了发送消息和写入数据库的原子性。我们不会在区域故障的情况下丢失事件。

  2. 向您的经纪人发送延迟消息

    一些像activemq and sqs这样的borkers支持这个功能,但是SNS不支持。解决方法是写入 sqs 队列,然后再写入 sns。当您的数据库不支持流时,这可能是一个不错的选择。

  3. 为可重试的获取发送特殊错误代码

    因为我们知道存在最终一致性,所以我们可以 return 向客户端发送特殊错误代码,以便他们可以根据此错误代码重试。重试策略应该是指数退避。但这可能意味着将您的问题暴露给客户。我们也应该有某种版本控制。

  4. 从其他区域获取

    如果在同一个区域没有找到实体,应用程序可以去另一个区域或主数据库来获取它。 注意 不要这样做。因为它是一种反模式。我在这里提到它只是为了完成。

  5. 在消息中发送完整实体

    如果 rest 服务要获取的实体很小,并且没有关于谁可以访问什么的安全限制,我们可以在消息中发送完整的实体。这是为了确保客户端不必在每次新消息到达时都显式获取它。