首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果方法收到并发客户端的购买请求,则每10个客户提供折扣

问如果方法收到并发客户端的购买请求,则每10个客户提供折扣
EN

Stack Overflow用户
提问于 2012-12-12 02:06:58
回答 2查看 258关注 0票数 0

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

EN

回答 2

Stack Overflow用户

发布于 2012-12-12 02:13:21

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

代码语言:javascript
复制
static final AtomicInteger COUNTER = new AtomicInteger();

if (COUNTER.getAndIncrement() % EVERY_NTH_USER == 0) {
   // give offer
}
票数 2
EN

Stack Overflow用户

发布于 2012-12-12 02:54:20

嗯,这是家庭作业的问题吗?您坚持使用时间戳,这样就不会给错误的客户提供折扣,以防它们被乱序处理。但是“每10个客户”听起来像是一个非常武断的规则。谁会关心订单到达服务器的时间而不是下单的时间呢?

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

要确定“每10个订单”,我认为根据定义,必须有某个中央服务器对订单进行计数,因此所有订单都必须流经这台服务器,或者至少“注册”到这台服务器。因此,计算订单的合乎逻辑的方法是在订单到达时进行计数。

我们可以拒绝经过最长等待时间后到达的订单吗?或者,例如,如果90%的时间订单将在3秒内到达,我们是否可以说,如果订单没有在3秒内到达,那么我们是否可以接受我们可能不满足严格的每十个订单的规则?如果答案是否定的,那么这个问题是不可能的。

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

代码语言:javascript
复制
(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

具体地说,根据时间戳规则,您不可能在收到订单时立即给予折扣,因为您无法知道是否没有另一个具有较早时间戳的订单正在发送中。

我们必须决定如何处理在最大等待时间之后到达的订单,是否拒绝它们,是否允许它们在到达时进行处理,等等。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13825967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档