Java 游戏后端开发入门, 涉及 quarkus vertx 最近一些思考

2022-09-08 09:52:11 +08:00
 ddonano
最近项目组开发直播在线类 unity 游戏,类似于 MMO 游戏,有房间、 多人在线概念,房间内人员加入、走动、退出,都要通知到的房间内其他人,所以需要一个高性能用户状态(主要是坐标位置信息)消息广播转发服务,当前的服务 基于 nodejs ,使用 koa 路由,grpc 转发,
由于本人一直从事 java 后端开发,所以想用 java 开发一个消息转发服务。

网上找资料零零散散找了很久,目前已经出来一个基础的 demo ,

基本架构:
提供的 url: interface/{userId}/{teamId}

负载:使用 nginx url hash
通过 hash teamId 将相同房间的负载到同一台机器,规避了服务器间相互调用。

服务:
使用了 quarkus 自带的 ServerEndpoint 注解的 websocket ,自带的 websocket 好像目前版本也用到了 vertx 这些,自己创建 map 管理 组内成员状态,这样组内广播也是单服务广播,暂时基本满足需求,无须全服广播,后期不确定有没有这个需求。 后期准备加入 verx cluster 这些特性,支持分布式。

目前进展:
正在找工具压测,
压测目标: 至少 100 个连接同时在一个房间内,一个新成员加入房间,随机生成坐标信息,通知到房内所有人(最大 99 人),同时房间内所有人当前坐标信息通知给这个新成员( 99+1 条消息)。当成员移动时,将坐标信息 发给房间内所有其他人( 99 条消息)。


网上找了一个工具 https://github.com/MirrenTools/Orion-Stress-Tester ,魔改了一下,支持我当前服务接口的 动态传参,但是初步测试了下,感觉性能也不是很强,是不是 quarkus 自带的 websocket 不是很强,看了下基于 undertow ,压测一会就有连接报错,感觉性能也不是很强?有大佬知道啥原因不,或者有兴趣的,一起交流下,
或者有其他 websocket 高性能广播转发开源组件 也可以推荐,谢谢大佬们了。
4256 次点击
所在节点    程序员
34 条回复
bthulu
2022-09-08 11:49:15 +08:00
@robot1 网页游戏这么搞有啥问题? 难道浏览器里能用 socket 了?
joesonw
2022-09-08 12:05:24 +08:00
0 游戏基础的 Java 话直接用 SmartFoxServer
dcoder
2022-09-08 12:23:39 +08:00
你们上面滔滔不绝的基本都没说在点子上...
首先该问贴主是做: real-time 的游戏 (e.g. 竞技 ACT, FPS), 还是 turn-based 的游戏?
turn-based 的话, websocket 这一套没有问题, 并且 websocket+stateful 的构架 还是比 Restful+stateless 的要难写.

但是要做 real-time 的话, 难度就几何级数上升:
1. 需要在 UDP 上用个快速的传输协议 (比如 KCP).
2. 需要在 server 和 client 端自己计算没帧的物理模拟(哪怕是最简单的也行). server 和 client 可以用不同的语言. 这里水也很深. 竞技游戏的话, 多半会基于 deterministic floating number 做 simulation. MMORPG 的话可以用差值糊弄糊弄, 不用每帧都是精确的 deterministic simulation.
lysS
2022-09-08 13:51:56 +08:00
@newmlp #2 要可靠就 tcp, 要不可靠用 raw udp, 比如语音、实时坐标数据等
ForkNMB
2022-09-08 14:20:48 +08:00
@bruce0 传奇游戏就用 java 写的啊。横版手游,同屏几十人还行吧哈哈哈
ddonano
2022-09-08 15:41:19 +08:00
@dcoder 大佬牛逼!!!我学习下 kcp
th00000
2022-09-08 16:01:42 +08:00
利益相关, 用 Vert.x 开发过线上吃鸡类游戏
但是 MMO 类型的话有待验证, 毕竟单线程可以容纳的在线人数有限, 吃鸡类就没这个问题, 大厅扩就是了
但是你也说过你的游戏是有房间概念的, 所以我觉得问题不大

另外 Netty 是 Netty, Vert.x 是 Vert.x, 不是两个互斥的技术栈
th00000
2022-09-08 16:04:06 +08:00
@th00000 #27 根据当时的压测结果, 8 核 32G 在线人数远远超你要做的 100 人
cloud107202
2022-09-08 16:06:34 +08:00
shardcake 这种不说成不成熟,effect-system 的框架就这么推荐新手用?

题主就从 linux 最大连接数、web server 线程池、所用具体 websocket 组件的 IO 操作是同步还是异步等几个地方依次排查下就行

压测可以用 galting 的 websocket module ,用 scala 简单写点代码,都是 DSL API 没什么门槛
q1angch0u
2022-09-08 16:07:29 +08:00
好奇游戏场景下 GC 的 STW 咋处理……
xf5464
2022-09-08 16:08:06 +08:00
移动同步的话,客户端这边按格子走,然后走到下一格的时候,服务端用上一次收到的移动格子时间和这次的时间差判断,是不是可以移动到当前格子,可以的话通知给其他人。每一格都验证,可能跟你说的移动不是一个事,比如一个格子 64*32 ,那么当客户端移动了很小的一段路,没到下一个格子的时候,是不会通知服务端的,也就不会通知到其他玩家。
Huelse
2022-09-08 16:20:09 +08:00
@lmshl #19 今天刚看到 akka 改 license 了,不过年收入$2500w 以内问题不大 https://www.lightbend.com/blog/why-we-are-changing-the-license-for-akka
lmshl
2022-09-08 16:55:11 +08:00
@Huelse 呜呜呜😭,哪壶不开提哪壶,呜呜呜😭
dqzcwxb
2022-09-08 17:03:31 +08:00
@allgy #18

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

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

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

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

© 2021 V2EX