拍卖系统中如何实现代理出价?

2015-10-19 15:40:51 +08:00
 a81874678

PHP 开发一个拍卖功能分为:常规竞拍和代理竞拍
参考 http://www.kongfz.cn/19722841/ (其实就是想实现和它一样的功能^_^,淘宝拍卖好像也可以设置代理出价)

在设置代理竞拍后系统怎么实现自动竞拍
比如商品起拍价为 1 元、最小加价为 3 元。
当 A 用户为第一个出价人出价为 1 元, B 用户出价为 4 元,如果 C 用户在 B 出价后设置代理价为 10 元,那么系统会自动出价 7 元,如果 A 出价为 10 元,这里最高价 10 元+最小加价 3 元已经大于 C 设置的最高代理价,所以 C 之前设置的代理价无效,系统不会自动出价。

目前想到方法
1 、单独写一个方法然后通过 计划任务 /Crontab 执行
Windows 下最小的 1 分钟(但可以设置多个触发器)
Linux Crontab 楼主不熟 Google 说可以设置以秒为周期来执行

那么问题来了,楼想要实现最好是代理可以实时执行,但执行周期太短会不会两次执行出现冲突。执行周期太长怕用户在最后 1 、 2 秒出价,代理不能执行的问题。

2 、在用户每次出价或是设置代理价的时候都检查有没有用户设置代理,然后执行。算是手动触发。

大家有什么好的方法分享一下,或是说一下上面哪种方法好点。

还有一个商品,特别是在设置了代理价后,他的出价记录很容易出现上千条记录,这些数据怎么存好一点呢,放一个表里随着时间和商品数量的增长,记录会越来越多,每个商品的出价记录分一表还是几百个分一个表,求指点!

4090 次点击
所在节点    程序员
24 条回复
owei
2015-10-19 16:10:55 +08:00
如果多个用户都设置的代理出价,根据你的逻辑是不是一个无线的循环了(在理论上,可以想象一个为一个多人触发的出价循环),我个人觉得,这个才是代出价的关键点吧
1 , 2 的方案都是可以的,区别就是实时性的问题了
oott123
2015-10-19 16:38:04 +08:00
2
a81874678
2015-10-19 16:46:05 +08:00
@owei 如果是多个用户都设置代理出价,那将循环到只剩下最高价的那个, 1 的方法就是将所有设置代理的商品统一执行一边, 2 的方法就只是执行当前操作的商品,感觉第二个实时性和效率更高,只是不知道会不会有什么没想到的问题。
a81874678
2015-10-19 16:49:29 +08:00
@oott123 (眨眼
domty
2015-10-19 17:02:59 +08:00
如果只是想在别人家的网站做个类似的自动排名插件,那无非就是“监听-请求”模型
如果是想在自己的网站里为用户提供自动出价功能,请注意数据请求的同步问题。所以把竞拍请求按时间顺序往一个请求队列里放,在取出每个请求的时候过滤掉一些无效的请求。
最后,要设置代理出价的话,这个代理出价的触发条件是啥。
SYP
2015-10-19 17:53:38 +08:00
参考里面用的是方案 1 ,最后一两秒好解决,结算的时候把有效代理考虑进去就行了,具体排序规则看业务需求;
方案 2 不好控制同时大量并发的问题,多人设置代理会突发性生成大量记录。
CRVV
2015-10-19 22:35:21 +08:00
有这么复杂么...

首先这个东西的本质并不是 代理出价,只是某一种拍卖的玩法而已

出价最高的人买到商品,他需要付的钱是 第二高的出价 + 最小加价。并且,最高的出价不公开,公开第二高的出价

每次有人出价了按这个逻辑算一遍就好呗
a81874678
2015-10-20 08:17:10 +08:00
@domty 是在自己的网站想要实现同样的功能。
我不太懂你所说的代理出价的触发条件这句是什么意思。

就是当有人出价,如果小于另一个人的代理价,那么代理将自己出代理价,当然可以同理出现多个人设置代理,这样就按价钱从小到大一直代理上去
a81874678
2015-10-20 08:20:19 +08:00
@SYP 方案 1.你的意思是结算的时候取有效的出价就好了是吧。但这个时候就会出现还剩 1 、 2 秒代理没有出价的可能。

方案 2.确实不要控制并发
a81874678
2015-10-20 08:24:19 +08:00
@CRVV 你说的这种是拍卖规则的一种,我这里要实现的是最高出价的人买到商品,并且公开所有出价
现在主要的问题是出现多个人设置代理,怎么实现系统快速的作出代理出价的响应
SYP
2015-10-20 09:45:00 +08:00
@a81874678 代理的最后出价结算时也是可以获取的,是按照时间线上的出价还是代理设置价格看业务需求了;反正到了这个时候已经没有输入了,只是把最后的数据做展示而已。
domty
2015-10-20 11:05:01 +08:00
@a81874678
做个假设,有两个买家设置了代理出价,一个设置的是 100 元,另外一个设置的是 90 元。
现在出价到 85 元,哪个先出价。
CRVV
2015-10-20 11:30:44 +08:00
@a81874678
你确定你要公开所有出价?
“ C 用户在 B 出价后设置代理价为 10 元,那么系统会自动出价 7 元”
这个 10 元要公开么?
a81874678
2015-10-20 12:49:49 +08:00
@CRVV 设置的代理价 10 就只有自己 可以看到,是不公开的,公开的是用户所出的(包括系统代理出的价格) 7 元或之前出过的价格
a81874678
2015-10-20 12:52:38 +08:00
@domty 我现在是按照先设置代理价先出的原则,
a81874678
2015-10-20 12:54:53 +08:00
@SYP 你是意思是说在结束的时候,就算是代理当时没有出价在结算的时候也可以补进去。不知道是不是我理解错了。
SYP
2015-10-20 13:19:33 +08:00
@a81874678 就是这样,这个时候交互已经结束,只是数据处理就很随意了,应该还有一些超时的数据要清理。
Felldeadbird
2015-10-20 15:55:58 +08:00
不需要 cron 定时执行。
帮楼主简单化流程。 ABC 三个用户,他们最终出价分别为 10 、 20 、 15. (这里是最终的,如何计算业务逻辑省去)。
程序获得所有用户的价格后,进行最终确认谁最高价最拍卖到。
---------------
得到上述信息后,假设 ABC 他们在不同时段进入。只要 PHP 端做好 有人访问 指定商品,或者列表页,则触发 “最终确认谁最高价最拍卖到” 该动作则可。
楼主可能会有疑问了,要是 ABC 同时访问,程序处理过程不是存在快慢问题吗?
在这个并发的过程,可以锁表 或者开启事务。防止上述情况,但不论怎样,最终结果都是一样的。只是快和慢而已。
----------------
至于 cron ,最大的好处就是提升了 商品的结算时间。若拍卖系统有大量的结算操作,从 web 服务软件经过 PHP 过程,已经消耗了很多的时间。。。
Felldeadbird
2015-10-20 15:58:57 +08:00
再补充一句,不论代理出价如何。其实最终程序还是要结算出所有参与拍卖的用户出价。 其实简单地来说,这个就像 我发表一篇 25 号才可以看到的文章,那么 SQL 就这样:
SELECT * FROM post WHERE post_data <= '.time().' ;
a81874678
2015-10-20 17:05:30 +08:00
@Felldeadbird 多谢指导,但是我这里还需要每次用户出价和时间的记录都要显示出来,并不是时间结束后再计算所有用户的出价。也就是说除了代理出价,还有用户手动出价的。
越看你的头像,我的大脑就越是一片空白,哈哈。不知道我说的和你上面讲的会不会有冲突。

你的建议是访问商品再触发事件,应该是处理所有设置代理的商品的业务流程吧?

再次感谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/229226

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX