Java 实现一个类似拍卖的系统 有个地方实现不了

215 天前
 zzzmh

如题 spring 全家桶用习惯了 换个东西反而写不出来了
后来学了一段时间 socket 实现了前后端通信
现在还有一个问题卡了很久没解决,请教各位大佬

一场拍卖假如说一共有 5 个阶段,其中每个阶段都有倒计时,有些操作会影响倒计时,比如出价加 5 秒,之类的。然后我要从 socket 里实时的读取到当前是什么阶段的什么状态,倒计时还剩多少秒。 其实一开始感觉不复杂,就到了实现的时候发现,线程也已经忘了怎么写了。。。百度也找不到合适的框架什么的能刚好合适这个需求。
今天就只想求个思路,比如说用 MQ 好,还是自己手搓线程好,还是怎么实现最合理。Thanks♪(・ω・)ノ 谢谢

3456 次点击
所在节点    Java
34 条回复
FawkesV
215 天前
初始设置是 redis 唯一 key ,value 存最后出价的人,到期时间存为结束时间。
点击加价就加锁来更新 出价人 value 和 结束时间吧 .
---
前端每次出价时,前端也自动更新页面的时间。再用高频轮训 http 请求去获取当前商品的结束竞拍时间,
conjane
215 天前
可以看看 akka
sunjiayao
215 天前
加价 http 请求-> 锁 {redis 加价}-> 加价成功 -> 通过 ws 向所有客户端推送最新价格和时间
dengji85
215 天前
前端轮循,后台返回拍卖的属性,拍卖阶段,剩余倒计时;
relsoul
215 天前
如果是小项目不要走 websocket ,如果要走 可以试试 socket.io ,我的建议是 直接前端轮询就行( 1s ),减少前后端的心智负担。所有的计算后端放 redis 处理。后端做延迟/定时任务更新 redis 的 key 即可。拍卖完成后落 db 。
如果是大型项目估计也不用我说 架构层应该已经评估了时间与开发量得出了解决方案。
hush3
215 天前
后端每秒定时向所有前端发一次消息,当有客户端改价,那计时器肯定要在后端这个改价接口里有变动,但是不影响每秒发给所有前端的逻辑,所有前端也能在下一秒收到改价后的新倒计时。
感觉剩余时间存内存一个变量就行吧
Keppel
215 天前
上半年实现了一个类似的拍卖功能,需求都类似
magicfield
215 天前
实时的要求就用长连接嘛,实现一般就是 http 轮询或 websocket ,邪道点还能用 hook 。
真实时间由后端控制,放数据库/redis ,小系统直接放缓存都行。
前端时间仅作为显示时间,定期 http 轮询同步或 websocket 同步
rev1si0n
215 天前
没试过,redis 的 pubsub 应该可以解决这个问题吧,每个客户连上对应的端点后,自动监听频道,客户端发价后后端验证处理并向频道广播。如果使用 web 框架的话应该也不需要单独开线程直接每个请求对应上去。
rev1si0n
215 天前
@rev1si0n 其他长链接的东西,socket 、websocket 看你怎么选了
coderxy
215 天前
你这需求根本不需要 websocket ,倒计时写到 redis 里, 客户端每 200ms 轮询一下当前倒计时并展示出来就完事了。 这种拍卖的业务不可能有多高的并发的。 不然你得自己写一套类似于长连接通讯的东西,对你来说开发量和熟练度都是问题。
cvbnt
215 天前
1 ,开始拍卖后写入 redis 设置倒计时
2 ,用户点击按钮后发送 http 请求到后端,后端对时间进行扣减
3 ,重点:后端要创建一个 server-sent events 接口,拍卖开始后所有用户通过 SSE 接口建立长连接,由 SSE 接口定时返回倒计时时间,用户前端显示倒计时(长连接避免轮询创建 http 请求降低服务器压力,相比 websocket ,sse 改造成本低且所有现代化浏览器都支持 sse )
Seulgi
215 天前
实际上不就是一个时间戳,一些动作触发+x 秒的操作,socket 同步给各个用户,页面实现时间戳转倒计时。
1Q1
215 天前
@coderxy 正解

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

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

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

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

© 2021 V2EX