来自谷歌的面试题: 死神杀人。
没有计划,随便猜一个;
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能够压缩字节