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

2023-10-30 09:32:41 +08:00
 zzzmh

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

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

3726 次点击
所在节点    Java
34 条回复
yumenawei
2023-10-30 09:40:08 +08:00
搜一下 websocket 看下,我也没具体了解过,好像可以解决你的问题
doublestart
2023-10-30 09:41:31 +08:00
一个用户出价, 然后通过发送消息给其他用户就行了, 用户量不大, 没必要用 MQ
bigLinux
2023-10-30 09:42:20 +08:00
当发生一些会影响倒计时的操作时,让前端发一个 UDP 的消息给后端,发消息的同时前端加上 5 秒,然后服务器收到这个消息也加上 5 秒。
doublestart
2023-10-30 09:42:58 +08:00
先学习下网络编程, 游戏服务端开发相关的, 找个开源项目看看
kujio
2023-10-30 09:44:52 +08:00
如果是会影响倒计时的操作,任何用户发送了这些操作,就同步发送给所有用户,通知他们重新倒计时,并带上倒计时开始时间
awalkingman
2023-10-30 09:45:00 +08:00
要实时,不就是 websocket 双工通信或者高频 http 定时轮询吗,这个语言框架有啥关系?
要定时,redis 或者别的中间件设置一下过期时间。就一台机子一个服务的话在应用里自己设置过期时间也行。
总之和语言没关系。
banmuyutian
2023-10-30 09:46:25 +08:00
janwarlen
2023-10-30 09:47:09 +08:00
@banmuyutian #7 啊?
darkengine
2023-10-30 09:48:13 +08:00
客户端只负责发起 ’我要出价‘ 这个动作

当前时间能不能出价,出价之后加 5 秒这些操作都在服务器端做,完成后把结果告诉客户端
c2const
2023-10-30 09:49:09 +08:00
@banmuyutian
啊?
lsk569937453
2023-10-30 09:55:20 +08:00
把倒计时的时间设计成 redis 的 key 的过期时间,所有的前后端通信只走 http 。

1.拍卖人员点击"开始拍卖",则写入 redis 中一个 key ,并且过期时间为 1 分钟。
购买人员打开网页,则前端以每 0.5 秒一个的定时任务去请求这个 key 的剩余时间。如果购买人员点击加价,则将 redis 的 key 的过期时间加 5 秒。

这个方案还有一些细节,比如想要记录一个购买阶段的截止时间,而 redis 中的 key 过期就删除了,则需要配合数据库一起完成。
zzzmh
2023-10-30 09:56:17 +08:00
我好像没描述准确,现在是用 springboot websocket ,实现了前后端交互,现在缺流程控制,比如说后端在 19.00 分给前端发启动拍卖,并给前端一个初始倒计时,然后中间加入的人,也会在初始化的时候,得到一个与其他人同步的倒计时。然后进入下一阶段,也会给前端发进入下一阶段,倒计时剩余多少时间。然后有人出价就会增加倒计时秒数,并同步给其他人。以此类推。现在就是这个倒计时怎么实现我很蛋疼,可能是网站写多了,游戏没学过,现在思路转变不过来。
zzzmh
2023-10-30 10:01:11 +08:00
@lsk569937453 多谢,感觉合适
lsk569937453
2023-10-30 10:02:20 +08:00
技术方案 2:

在数据库/redis 中记录最终的时间,然后前端去计算秒数,所有的前后端通信只走 http 。

1.拍卖人员点击"开始拍卖",则写入 redis 中一个 key ,且 value 值为当前时间+1 分钟后的时间。
购买人员打开网页,则前端以每 0.5 秒一个的定时任务去请求这个 key 的时间,然后计算出剩余的倒计时。如果购买人员点击加价,则将 redis 的 key 的过期时间加 5 秒。
lsk569937453
2023-10-30 10:02:49 +08:00
@lsk569937453 如果购买人员点击加价,则将 redis 的 key 的 value 的时间加 5 秒。
banmuyutian
2023-10-30 10:05:29 +08:00
@zzzmh
一个一秒的定时任务往 websocket 推送剩余时间,一个接口每次收到出价增加剩余时间,记得用 volatile 修饰
asmoker
2023-10-30 10:05:56 +08:00
这不就是在线答题差不多
aibx01
2023-10-30 10:12:29 +08:00
如果仅仅是定时这个需求。
把结束时间存 redis 中,前端也记录一个时间,5s ~10s 去跟后端进行同步即可。每次加时,后端拿到锁之后,去更新 redis 的即可,redis 到期时间设置为 实际的结束时间。如果加时判断 redis 已不存在,则为拍品时间已结束。
xianyv
2023-10-30 10:14:10 +08:00
@zzzmh 倒计时用 redis 的 key 的过期时间,等 redi 的这个 key 过期了,就通过 websocket 通知其他用户拍卖结束.
zhazi
2023-10-30 10:19:32 +08:00
while true 每秒检查一次就行了

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

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

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

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

© 2021 V2EX