android - 如何在交易过程中保持手机和服务器同步?

标签 android ios spring-boot mobile architecture

我正在向数据库提交事务。如果客户端在事务期间丢失 wifi 连接,但在提交后它不会知道事务已完成。问题在于,如果移动应用程序同意并且服务器知道 1) 移动应用程序已同意并且 2) 移动应用程序知道事务已完成,则服务器应该只永久提交事务。解决方案似乎是让移动应用程序发送确认交易的确认消息,但是如果在服务器收到确认之后但在服务器发回 200 之前发生断开连接问题怎么办?现在服务器认为移动应用程序知道,但移动应用程序不确定服务器是否收到此消息。这几乎看起来像是某种类型的握手,因为双方都必须知道每一方的内容。问题是如何在不可靠的网络中处理事务,其中服务器需要知道客户端既接受了事务又知道事务已经完成,然后才使事务永久化。

最佳答案

这是 Two General's Problem ,因此无法解决。确认的确认只是另一个要确认的消息,因此在有限的时间来回中,您永远无法完全确认原始消息已发送并且双方都肯定知道。

在实际生活中,你将不得不选择你接受什么样的风险。对于像 friend 同意见面这样的低风险消息,一个确认回复通常足以让他们继续进行,尽管回复可能从未真正通过。现在考虑通过基于 GPRS 的 EDC 进行支付。总是有可能连接在完全交付付款指令后立即断开,并且在客户决定离开之前没有恢复。如果没有打印确认收据,商店通常会将付款视为从未完成,仅在稍后恢复交易。商店和客户都接受这种风险。

"Your Coffee Shop Doesn’t Use Two-Phase Commit"在设计系统时,post 是一本非常好的读物。考虑要求。回滚 Not Acceptable 吗?是否存在一定程度的可以容忍甚至预期的不一致?也许您甚至可以减少客户端的角色,只尝试发送命令,然后从服务器回读,丢弃它自己的。

关于android - 如何在交易过程中保持手机和服务器同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61263776/

相关文章:

ios - 将谷歌分析集成到 iOS 应用程序中

spring-boot - 微商。环境的记录器配置

spring-mvc - Spring Boot/MVC 通过注解过滤

android - AsyncTasks 需要几秒钟才能启动

Android支持库v7,无法获取ActionProvider

ios - 如何移动到 pageViewController 中的特定页面?

ios - 在 Swift 中使用 PFQueryTableViewController(来自解析)

java - 运行使用 Cucumber 实现 CommandLineRunner 的 SpringBoot 应用程序,在运行功能测试用例之前运行主应用程序

android - dlopen 和 System.loadLibrary() 之间的区别

java - 在 Android 中获取 Facebook 页面状态更新列表