0

我正在编写一个简单的分布式程序。buy 方法使用 RMI 为并发客户提供服务。我想给每 10 个客户打折。购买请求的排序基于他们的时间戳来选择第 10 个客户。实施购买方法的最佳方法是什么。

4

2 回答 2

2

有很多方法可以做到这一点。如果时间戳足够随机,您可以使用它,但您也可以使用。

static final AtomicInteger COUNTER = new AtomicInteger();

if (COUNTER.getAndIncrement() % EVERY_NTH_USER == 0) {
   // give offer
}
于 2012-12-11T18:13:21.187 回答
0

嗯,这是作业问题吗?你坚持使用时间戳,这样你就不会给错误的客户打折,以防他们被乱序处理。但“每 10 个客户”听起来像是一个非常武断的规则。谁在乎您是否在订单到达服务器时而不是在下订单时经过?

如果我们假设它必须通过下订单时分配的时间戳来完成,但决定折扣的服务器不一定会按顺序接收订单,那么......在下订单之前是否存在已知的最大延迟到达服务器,我们可以在应用折扣之前至少等待那么长时间吗?如果没有,问题是无法解决的。如果服务器查看订单上的时间戳并确定某个订单是 10 号,它如何知道没有另一个订单,时间戳介于 9 和 10 之间,仍在运输中且尚未到达?

为了确定“每 10 个订单”,我认为根据定义,必须有一些中央服务器正在计算订单,所以所有订单都必须通过这个单一的服务器,或者至少在这个单一的服务器上“注册”。因此,计数的逻辑方法是在订单到达时对其进行计数。

我们可以拒绝在最长等待时间后到达的订单吗?或者,例如,如果 90% 的时间订单将在 3 秒内到达,我们是否可以说如果订单未在 3 秒内到达我们接受我们可能不符合严格的每 10 次订单规则?如果答案是否定的,那么问题是不可能的。

如果问题的定义是它必须基于独立并发服务器分配的时间戳来完成,那么我认为可以完成的唯一方法是有一个已知的最大时间,即订单到达中央来自卫星服务器的服务器。然后按时间戳对订单进行排序,并在获得最后一次折扣后数十。如果该订单上的时间戳小于 maxium-wait-time 前,那么我们必须等待,然后再决定是否可以授予折扣。然后返回并再次尝试该过程,这次包括自上次尝试以来到达的所有新订单。就像是:

(pseudo-code)
loop forever
  select order_id, timestamp from orders where prcoessed=0 order by timestamp
  count to tenth record
  if timestamp<now-max_wait then
    award discount to number 10
    mark numbers 1 to 10 as processed
  else
    do nothing
  endif
endloop

具体来说,考虑到时间戳规则,不可能在您收到订单的那一刻就给予折扣,因为您无法知道没有另一个具有更早时间戳的订单正在送达。

我们必须就如何处理在最长等待时间后到达的订单、是否被拒绝、是否允许在到达时进行处理等做出一些决定。

如果您希望在客户下订单时通知他们他们正在收到折扣,那是不可能的,因为您不知道。好吧,如果最长等待时间足够短,比如不超过几秒钟,您可以推迟对客户的回复,直到时间过去。如果最长等待时间是几分钟,我认为您不能将响应拖延那么久。但我想这取决于其他要求。

于 2012-12-11T18:54:19.930 回答