我正在写一个简单的分布式程序。buy方法使用RMI为并发客户端提供服务。我想给每10个顾客打折。购买请求的排序是基于他们的时间戳来选择第10个客户。实现buy方法的最佳方式是什么?
发布于 2012-12-12 02:13:21
有很多方法可以做到这一点。如果时间戳足够随机,则可以使用时间戳,但也可以使用时间戳。
static final AtomicInteger COUNTER = new AtomicInteger();
if (COUNTER.getAndIncrement() % EVERY_NTH_USER == 0) {
// give offer
}发布于 2012-12-12 02:54:20
嗯,这是家庭作业的问题吗?您坚持使用时间戳,这样就不会给错误的客户提供折扣,以防它们被乱序处理。但是“每10个客户”听起来像是一个非常武断的规则。谁会关心订单到达服务器的时间而不是下单的时间呢?
如果我们假设它必须由下单时分配的时间戳完成,但是决定折扣的服务器不一定会按顺序接收订单,那么...在订单到达服务器之前是否存在已知的最大延迟,我们可以在应用折扣之前至少等待那么长时间吗?如果不是,这个问题就无法解决。如果服务器查看订单上的时间戳并确定某个订单是10号订单,它如何知道没有时间戳在9号和10号之间的另一个订单仍在运输中且尚未到达?
要确定“每10个订单”,我认为根据定义,必须有某个中央服务器对订单进行计数,因此所有订单都必须流经这台服务器,或者至少“注册”到这台服务器。因此,计算订单的合乎逻辑的方法是在订单到达时进行计数。
我们可以拒绝经过最长等待时间后到达的订单吗?或者,例如,如果90%的时间订单将在3秒内到达,我们是否可以说,如果订单没有在3秒内到达,那么我们是否可以接受我们可能不满足严格的每十个订单的规则?如果答案是否定的,那么这个问题是不可能的。
如果问题的定义是必须根据独立并发服务器分配的时间戳来完成,那么我认为可以做到的唯一方法是具有一个已知的最大时间,即订单从卫星服务器到达中心服务器所需的最大时间。然后按时间戳对订单进行排序,并在最后一次折扣后数到十。如果订单上的时间戳小于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具体地说,根据时间戳规则,您不可能在收到订单时立即给予折扣,因为您无法知道是否没有另一个具有较早时间戳的订单正在发送中。
我们必须决定如何处理在最大等待时间之后到达的订单,是否拒绝它们,是否允许它们在到达时进行处理,等等。
如果您希望在客户下单时通知他们正在收到折扣,这是不可能的,因为您不知道。好吧,如果最大等待时间足够短,比如不超过几秒钟,你可以推迟回复客户,直到时间过去。如果最长等待时间是分钟,我认为您不可能拖延那么长时间的响应。但我猜这取决于其他要求。
https://stackoverflow.com/questions/13825967
复制相似问题