【问题标题】:How to calculate who is accepted order first?如何计算谁先接受订单?
【发布时间】:2020-05-09 11:12:30
【问题描述】:

有一些用户。他们可以执行命令。可为所有用户发送订单。

当用户收到订单时,他可以在 1 分钟内接受或拒绝。

如果用户接受订单,我会将信息存储在 MySQL 中。

id | order_id | user_id | timestamp
1    1          1         12345679
2    1          2         59589333

一分钟后,没有人可以接受订单。

之后,我的服务会处理所有存储的数据并计算谁先接受了订单。

问题是用户可以比其他人更快地接受订单,但是由于互联网连接或其他原因,日期会被扭曲。

有两种方式:

一个(计算客户端接受时刻的时间):

  1. 用户接受订单
  2. 获取当前时间戳
  3. 向服务器发送当前时间戳
  4. 在 Db 中存储当前时间戳

秒(在将数据存储在 Db 中的时刻计算服务器上的时间)

  1. 用户接受订单
  2. 向服务器发送数据
  3. 获取当前时间戳
  4. 在 Db 中存储当前时间戳

因此,不能保证按创建的时间戳对用户进行排序。而且我不能分配订单优先用户,因为我对时间没有信心。

【问题讨论】:

  • 听起来您需要高度的实时精度。那是什么精度?每个系统都会有不确定性。你能容忍什么程度的时间不确定性?这听起来对您来说非常重要的是实时知道哪个人实际上首先点击了他们的鼠标。在这种情况下,大多数先到先得的网络策略都不会特别费力地纠正网络延迟等。它对你如此重要有什么特别的原因吗?
  • 主要是为了解决两个用户同时接受一个订单的不确定性。
  • 我也应该使用队列来存储所有接受的订单吗?
  • 但这种不确定性有多重要?如果人 1 点击“接受”,那么人 2 在现实世界中 30 毫秒后点击“接受”,但由于延迟、处理等原因,人 2 的条目首先记录在服务器上。这真的对你来说是个问题吗?因为在现实世界中首先点击鼠标,所以授予第 1 个人的命令真的很重要吗?还是您只是陷入了细枝末节,无缘无故地让自己的工作困难了十倍?

标签: c# mysql algorithm rabbitmq


【解决方案1】:

网速慢或其他原因是用户问题。您应该只关心女巫命令更快地到达您的服务器。您可以使用它向您的数据库发送订单。

INSERT INTO orders (order_id , user_id, reached_time) VALUES(1, 1, NOW());

然后像这样选择它们。

SELECT id, order_id, user_id FROM orders WHERE reached_time < '2020-01-01 01-00-00' ORDER BY reached_time ASC;

日期时间 '2020-01-01 01-00-00' 是截止日期,在此之后的任何订单都不会被选中。

【讨论】:

    猜你喜欢
    • 2020-05-17
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多