如何安全、可伸缩地实现银行/交叉订单类型更新

2024-09-27 17:38:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在googleappengine上做一个小项目,试图实现一个允许参与者买卖假货的网站,类似于股票市场,系统会实时显示买卖价差。你知道吗

举个简单的例子:

  • 卖家下订单以8.00的价格出售10盒(订单1)
  • 买方下订单购买5箱,价格不超过9.00(订单2)

下第二个订单时,系统将需要执行多个任务,所有这些任务都取决于所有任务是否成功完成。你知道吗

  • 从买方处获得支付箱子的资金(8.00 x 5)并将其交给卖方
  • 从卖方处取出盒子(5)交给买方
  • 将订单更新为“完成”(OID 2)或更新为“部分已满”(OID 1),以便它们不能重复匹配
  • 向每个参与者收取费用并将其添加到系统帐户中
如果我所需要的是把资金从一个参与者转移到另一个参与者,即使系统在中间失败,我也可以安全地做到这一点。但是要确保上面所有的任务都正确完成,并且在其中任何一个任务失败时回滚,在appengine中似乎过于复杂了。你知道吗

此外,我的“订单簿”和订单匹配引擎现在是单线程的(使用互斥锁进行锁定)。这似乎违背了使用appengine的全部要点,但我不确定我是否能找到解决方法。你知道吗

所以(最后)-我的问题是:

  • 使用appengine时有多个步骤都依赖于每个步骤是否正确完成,是否有最佳实践?你知道吗
  • 有没有人对如何允许订单是多线程的,或者如果它仍然是单线程的有什么建议?有没有一个最佳实践,就是在网站扩展时不要让这个核心部分阻碍网站的使用?我曾考虑过使用任务对订单添加/更新/取消进行排队,以便将书本与直接参与者输入分开。你知道吗

谢谢你,我期待你的帮助!你知道吗


Tags: 项目订单网站系统步骤价格参与者oid
2条回答

我认为如果你能对一种商品的订单排序,那么你就可以离线清除订单。所谓“下线”,我的意思是你可以在一天结束时来找我,告诉我订单的顺序,我可以告诉你发生了哪些交易。一个障碍是,如果买家没有资金,而交易本应结清怎么办?您可以通过两种方式解决此问题:

  1. 把资金交给第三方保管,这样任何可以结清的订单都可以。你知道吗
  2. 如果资金不可用,当你试图结清订单时,就放弃购买订单。你知道吗

正如您所建议的,您可能需要跨实体的集团交易,以确保资金转移是正确的(即既不创建也不销毁资金)。你知道吗

您可以按时间排序订单(例如,paced\u at=db.DateTimeProperty属性(auto\u now\u add=True))。如果两个订单有相同的时间,那么使用一些东西(最好是公平和确定的东西)来打破僵局。在这里,数字id的散列(为了公平)(为了决定论)可能不是一个坏的选择。你知道吗

appengine本质上是多线程的,因为一个App可以有许多并发实例(但实例不一定是同一进程中的线程)。实例是自动创建的,目前无法将实例数限制为1。如果应用程序的状态是在数据存储中(而不是本地内存、memecache或其他地方),并且事务是正确的,那么应用程序将是“免费”多线程的。当然,你的交易是正确的不是微不足道的。你知道吗

另一个要记住的工具是任务可以是事务性的。如果您想使用任务进行脱机图书清除,这可能很有用。你知道吗

对于其他偶然发现这一点的人-

在谷歌应用程序引擎中,似乎可以进行跨组交易:

https://developers.google.com/appengine/docs/python/datastore/transactions#Using_Cross_Group_Transactions

这意味着您可以在单个事务中同时读取、执行逻辑,然后一次写入多个实体。你知道吗

我相信这解决了我在问题中提出的第一个问题。你知道吗

第二个问题-有没有办法让订单簿不是单线程的,仍然是开放的。你知道吗

谢谢你!你知道吗

相关问题 更多 >

    热门问题