我有一项接受来自提供商的回调的服务。 动机:我不想丢失任何回调(当然,除非我的网络无法访问)。
假设发生了不可能的事情,并且我的 mysql 服务器在一段时间内无法访问,我想在重试几次但失败后回退到辅助持久性存储。
我有哪些选择?队列,内存缓存?
我有一项接受来自提供商的回调的服务。 动机:我不想丢失任何回调(当然,除非我的网络无法访问)。
假设发生了不可能的事情,并且我的 mysql 服务器在一段时间内无法访问,我想在重试几次但失败后回退到辅助持久性存储。
我有哪些选择?队列,内存缓存?
你说你正在接收“回调”——你还没有弄清楚它们是什么。什么是协议?是否通过网络。
如果是 HTTP,那么我会说最好的方法是,如果您的应用程序无法将数据写入永久存储,它应该向调用者返回一个错误(如果协议中存在“稍后再试”),谁应该稍后再试。
像回调这样的异步进程应该始终能够处理下游故障并将其请求排队。
我曾与一家支付服务提供商合作过(Paypal)。如果您无法完全处理请求,只需将错误发送回调用方。
我推荐某种作业队列服务器。我个人使用 Starling 并取得了很好的效果。它使用 memcache 协议,因此很容易用作持久队列。 Github 上的 Starling
我之前已经为此在 SQLite 中放置了一个队列。不过,在我的例子中,它是为了防止与 MySQL 服务器的网络链接丢失——数据是本地生成的。
您可以拥有一个备份 MySQL 服务器,并将连接切换到该服务器,以防主要服务器出现故障。如果它只是一个故障转移存储,您可能会在应用程序服务器上本地运行它。