V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
a81874678
V2EX  ›  程序员

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

  •  
  •   a81874678 · 2015-10-19 15:40:51 +08:00 · 4092 次点击
    这是一个创建于 3323 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 、在用户每次出价或是设置代理价的时候都检查有没有用户设置代理,然后执行。算是手动触发。

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

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

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

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

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

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

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

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

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

    再次感谢!
    Felldeadbird
        21
    Felldeadbird  
       2015-10-20 19:58:23 +08:00 via iPhone
    @a81874678 如果要保留过程,那么就将计算过程入库就可以了。反正方法都一样的。
    frienmo
        22
    frienmo  
       2015-10-20 20:37:34 +08:00
    @CRVV 让我想到了暗黑 3 的拍卖场
    CRVV
        23
    CRVV  
       2015-10-20 22:40:10 +08:00
    @a81874678
    你仔细地看一下我的第一条回复,和你设计的交易方式和规则,是不是一样的
    a81874678
        24
    a81874678  
    OP
       2015-10-21 08:22:33 +08:00
    @CRVV 基本是一样的,最后价高者得,但是要显示出所有用户的出价记录

    这里的出价记录是用户‘手动出价’和系统‘代理出价’的集合按时间和金额从高到低排序。

    但并不会显示用户设置的‘代理金额’。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1359 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:38 · PVG 01:38 · LAX 09:38 · JFK 12:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.