Asynchronous 如何处理数据复制延迟和事件通知

Asynchronous 如何处理数据复制延迟和事件通知,asynchronous,amazon-sns,database-replication,Asynchronous,Amazon Sns,Database Replication,我们有一个简单的应用程序,它在每次更新实体时都会向SNS发送通知(很可能是任何其他排队系统)。客户端正在侦听这些通知,并根据这些通知获取更新的实体 我们面临的问题是,当客户端执行get时,有时数据没有被复制,我们返回404或有时是过时的数据(甚至更糟) 我们如何在发送通知时缓解这种情况呢?这里有一些策略可以缓解这种情况,有其利弊 而不是从应用程序发送通知使用数据库流发送通知 例如,dynamodb streams和aws lambda。这种模式在多区域部署的情况下也很有用。所有订阅者、发布者都将

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

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


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

这里有一些策略可以缓解这种情况,有其利弊

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

    例如,dynamodb streams和aws lambda。这种模式在多区域部署的情况下也很有用。所有订阅者、发布者都将订阅其区域数据库流。同时还保留了发送消息和写入数据库的原子性。在区域性失败的情况下,我们不会放过事件

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

    一些博克人喜欢并支持这一功能,但SNS不喜欢。一种解决方法是写入sqs队列,然后将其写入sns。当您的数据库不支持流时,这可能是一个很好的选择

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

    因为我们知道最终的一致性是存在的,所以我们可以向客户机返回特殊的错误代码,以便他们可以基于此错误代码重试。重试策略应该是指数退避。但这可能意味着把你的问题告诉客户。此外,我们还应该有某种版本控制

  • 从另一个区域提取

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

  • 在消息中发送完整实体

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