Java游戏服务器5

2021/02/07 07:01
阅读数 82

来自谷歌的面试题: 死神杀人。
    没有计划,随便猜一个;
    A计划: 50~75%的概率;
    99.5%的概率生存--》但是也可能全都死;


1)单线程方案
    单线程? 不会慢么?
    解决慢,要比教会所有人跨线程写逻辑简单;
    架构师的工作是取舍和折中,不要炫技;
    项目框架越简单,适用性就越广;
    可以出错,但是错误不要向下传递;
    
2)游戏的单线程方案
    问题的提出: 
        A和B都打C,那么可能引起死锁。
        加锁的话,并不是每个人加锁时都头脑清醒的。   









    由于都是在内存中操作的,单线程也很快,慢在IO。

3)单线程池
    让写业务的人不去考虑多线程。

4)LinkedBlockingQueue:
     还可以有拒绝策略, 直接告诉:服务器繁忙。

5)业务单线程架构模型:生产者消费者模式
    Netty那边是IO线程,是要消耗点时间的。
    业务线程,则是在内存里面,单线程也处理的过来。 都是线上验证过得,开发也比较简单。
    
6)游戏服读写数据库: CRUD ==》MyBatis --》从用户登录做起



7)不用管框架的运行机制,直接添加Handler即可。

8)游戏服灰度发布: 由于存储的有状态,做不到热部署
    2个进程。

9)IO操作是在主线程上执行的: 读写数据库时,造成线程阻塞。
    问题: 几毫秒 几十毫秒 甚至几秒,会阻塞主线程。

    我们需要增加另外一个线程处理数据库操作,那具体怎么做呢?

10)形象类比
                        Netty

                 多个美女接待员(BossGroup)             

    我                                             上菜员(MainThreadProcessor)        多个厨师(AsyncOperationProcessor)

                 服务员(WorkerGroup) 


11)登陆就相当于异步操作了,那么就写一个异步操作相关的包。

12)打包: 默认resources文件夹下的会被打包到jar中,但是其它目录的不会,需要手动配置才行

13)一部分业务是:主线程。  
     一部分业务是在:异步线程中。
             因此是跨线程了,2个线程操作了相同的数据,造成错误。


     ==》数据库的部分做异步就足够了,其它部分,还要走正常的逻辑。

     线程绑定。

14)多线程处理IO时,
    2次操作如果被分配在2个线程中 "查数据 和 插入数据"。  ==》 如果是领奖操作,那么就可能被刷的风险。

    加锁: 又要加锁了么????

    无锁: 
        根据操作的特征值,把符合这个特征值的操作,分配到一个线程中执行。
        比如: 即时执行了2次查询,那么由于在一个线程中,因此保证线程安全了。一个萝卜一个坑的感觉。

15)游戏服务器开发的本质: 完成业务逻辑向多线程的映射。

16)引入MQ后: 让数据库的读写操作放到别的进程和机器上。 多线程生产者消费者的使用就是MQ的一个缩影。

17)pb能够压缩字节

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部