【问题标题】:ebay, how do they end their auctions when time expired? [closed]ebay,他们如何在时间到期时结束拍卖? [关闭]
【发布时间】:2019-07-14 11:33:00
【问题描述】:

eBay 如何结束拍卖并标记获胜者?假设数据库中有一个拍卖结束日期,一旦该时间超过当前时间,就需要关闭拍卖,标记获胜者等。这样的事情在 sql 2005 中是如何处理的?他们是否每秒查询数据库以查找过期的拍卖?显然,他们需要在拍卖结束后立即将其标记为已关闭。他们不可能为每次拍卖创建 sql 作业,或者是吗?有任何想法吗?我有一个遵循类似思考过程的集成,需要帮助。

【问题讨论】:

  • 我会假设在某个地方你会在内存中生成一个队列来存储在接下来的二十分钟内结束的每个项目,然后在每次页面加载时检查它,然后每十五分钟更新一次该列表数据库,使其永远不会过时。
  • 我无法想象他们正在从网页处理。它需要在结束后立即生效,如果有人在该页面上,则需要更新。在页面加载时为每个用户检查该队列会产生很多开销。
  • 您假设在接收端有一个现成的 RDBMS。有(最终)但我真的怀疑是否有 T-SQL 或 PL-SQL 管理“最后一秒”。拍卖的结束太奇怪了,无法处理。我保证有自定义 C/C++ 代码在非常低的级别管理该进程,例如TCP/UDP 数据包。它最终确实会进入数据库,但是......如果你曾经在 Ebay 上卖过汽车,(我有)你会目睹只有低级代码才能处理的最后一秒的疯狂。
  • 这是一个发人深省的问题 - 虽然我不认为您的 SQL DB 问题接近目标,但我喜欢您的吊臂。

标签: sql sql-server-2005 message-queue


【解决方案1】:

显然他们需要将其标记为 拍卖结束后立即关闭。

是的,但不一定是实时的。

这样的事情在 sql 2005 中是如何处理的?

一点也不。数据库就是数据库。对于实时定价/拍卖计算,您将使用程序。基本上,更新数据库,但不要从数据库运行逻辑。

他们是否每秒查询数据库以查找过期的拍卖?

一种方式。另一种方法是在内存中有一个按过期时间排序的拍卖列表,然后只检查哪些过期时间。

他们不可能为每次拍卖创建 sql 作业,或者是吗?

可能不会。

我要做的就是在内存中保存一份拍卖清单。通过每台服务器进行 X 次拍卖来实现可扩展性。

【讨论】:

  • 如果结束日期发生变化怎么办,例如每次出价都会更改结束日期的便士拍卖。除非您每隔几秒更新一次,否则内存中的队列可能不同步。
  • 啊,内存队列是master,不是数据库。更改被写入数据库以保持持久性,但内存中的副本是真实的主文件。除非在程序启动时,否则无需读取数据库。
  • 嗯,你有这个例子的链接吗?我使用的是 asp.net 4,从未使用过内存队列,因为我以前的应用程序没有那么密集。
  • 嗯,问题是——他们不会为此使用 Web 前端技术,而是使用应用程序服务器。例子?嗯,我这里有代码(金融市场模拟器),但是我不能分享。
  • 看起来我可以用 sqlite 运行一个混合体?你以前用过吗?推荐其他人?
【解决方案2】:

我认为拍卖的状态是拍卖结束日期和当前时间的结果。您无需更改数据库即可更改拍卖状态,通过拍卖结束日期的当前时间将为您完成。

查看拍卖的用户只会根据请求查看状态,因此可以在请求时确定状态。任何物理动作(向获胜者发送电子邮件)都不必是真正的实时动作。只是投标的结束必须是;并且可以根据每个投标确定状态

【讨论】:

    【解决方案3】:

    我曾想象拍卖记录具有EndDate 之类的属性。超过这一点将不接受任何投标。出价时,客户端应用程序会将NowEndDate 进行比较。同样,在尝试记录该出价时,数据库会检查 Auction.EndDateNow()

    我不确定客户是否应该更新auction.status="Closed"。这是对客户的依赖,也许数据库不应该依赖客户来“结束”拍卖。建议应该预先确定,不需要干预。

    【讨论】:

      【解决方案4】:

      我的猜测是一个调度程序和一个作业/任务队列,其中每个任务的执行时间都与拍卖的到期时间一致。调度器定期检查队列,当拍卖时间过去时,任务被执行。该任务将拍卖的状态更改为“关闭”,因此在该点之后无法进行投标。这也可能触发其他一些操作,例如向获胜者发送电子邮件。

      【讨论】:

        【解决方案5】:

        根据您的项目规模,您可能会使用执行大规模关闭拍卖的单个 SQL 作业。每分钟运行一次。

        Update [Auctions] SET AuctionStatus = 'CLOSED' WHERE CloseDate <= CURRENT_TIMESTAMP;
        

        让您的应用程序逻辑仅将出价发布到满足相同 where 条款的拍卖。

        然后,您可以使用另一个计划的作业处理拍卖获胜者,并针对尚未处理的已结束拍卖运行。

        【讨论】:

        • 您不能等待拍卖结束。我在编写拍卖系统时使用了这种方法,但以后不会再这样做了。但是,我首先有一个工作每十秒运行一次,将关闭的项目设置为“处理”,然后有另一个工作每隔一分钟运行一次以实际关闭它们。由于要创建和更新的数据库记录数量以及需要生成的电子邮件数量,处理时间相当长。
        • @rboarman - 你做了什么样的负载?你有可扩展性问题吗?
        • 我们最大的拍卖是安然,是的,我们遇到了负载问题。安然负载为 20,000 个同时用户。一般来说,在正常负载(大约 2000 人)的情况下,我们没有任何问题。
        【解决方案6】:

        首先出现在我脑海中的是一个 javascript 函数,当拍卖倒计时计时器达到某个数字时调用它,在这种情况下我会想象为 0。让该函数对脚本进行 ajax 调用,这将验证拍卖确实已经过期,然后更新数据库。

        【讨论】:

        • 这不起作用,因为您必须在浏览器中打开该项目才能关闭它。不实用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        相关资源
        最近更新 更多