2017-07-02 72 views
1

我正在构建一个数据库,其中一些表将填充为“使用它或丢失”场景的自动应用程序流。这意味着数据将通过Webhook(PayPal IPN)进入,如果我的RDBMS拒绝INSERT,那么数据将丢失,即没有操作员检查/更正数据并重试。如何确保来自webhook的数据的一致性

一个简单的解决方案是通过排除NOT NULL甚至可能使字段基于文本来使DB字段尽可能简单。

一致性问题依然存在。我怎样才能确保这一点?是否应该包含可能包含在数据库中的检查,并在出现问题时记录警告。

现实情况是,如果WebHook服务发生变化,事情只会中断,但我想为这种情况做好准备。

UPDATE:

我想另一个办法可以是逐字缓存中的NoSQL存储中的所有传入的网络挂接的消息。不管上述问题,这可能是一个好主意。

+0

尝试使用''commit''和''rollback''命令https://www.tutorialspoint.com/sql/sql-transactions.htm – Dimgold

+0

我认为你错过了这个问题。回滚之后我会做什么? – conor

回答

0

这一切都取决于它是多么重要的是你不失去这个事件/数据。

由于网络问题或其他问题,webhook永远都不会被调用,但是如果我们假设PayPal负责确保您的服务器上的webhook最终被调用(即他们已经重新尝试了它们侧,如果事情失败),你可以接近100%保证,你不会失去你身边的数据,通过执行以下的一种或多种:

  • 在servlet /应用receiveing网络挂接在您身边,确保您尽可能少地使用它,除了可能验证数据以确保它以一致的形式存储在您的身边。有人可能会争辩说,如果您想在以后重新播放它们,您还应该坚持使用意外数据的无效事件或事件。

  • 如果有代替(如RabbitMQ的,卡夫卡,卡桑德拉,Redis的,或类似的)消息代理/队列系统或其它高库存状况分布式数据存储,则应该有发送事件。您可能会选择始终这样做,或者仅在直接向数据库执行写操作失败时才执行此操作,但为了简单起见,最好始终将事件放在队列中,并有一个单独的进程从队列中读取并写入数据到SQL数据库。

  • 如果您没有队列系统,或者将事件存储在队列系统中失败,则可以在处理webhook的节点上的本地磁盘¹上保留事件。这种回退可能有助于您在写入数据库和/或队列系统失败时恢复“丢失”事件。

  • 在一个单独的进程中,从队列或其他分布式存储中获取事件,并将其插入到数据库中。如果写入数据库成功,这个过程只应该确认队列上的消息,否则消息不应该被确认,因此消息可以被重新处理。

还有更多的这些技巧可以让你更接近100%保证永远不会错过任何事件。最后,一切都会失败,如果你想要一些非常健壮的东西,你应该设计它,期望任何事情都会在某个时候失败。

但是,即使yuo具有分布式消息队列,如果写入队列失败并且写入本地磁盘失败,则可能会丢失数据。在这种情况下恢复数据的唯一方法是让PayPal重新播放该事件并使用相同的数据再次调用webhook,或者从PalPal手动检索相同的数据(如果可能)。

BTW:是否使用一个队列,或只是一个“哑”分布式数据存储库,用于存储事件取决于你是否在意处理顺序,同一事件多次处理等

¹如果您登录在webhook节点上处理数据时,您可以免费获得本地磁盘持久性,但这取决于您是否能够实际记录事件中的所有数据,如果事件包含敏感数据,这可能不可行。如果您在plcace中有某种类型的日志传送或分布式日志记录服务器,这也可能(部分)保护您在webhook节点上的磁盘失败或节点本身失败(即,虚拟/云服务器正在重新启动并丢失其磁盘) 。