简单Elixir游戏服设计-关于call仍是cast

 

以前写了篇关于call仍是cast的讨论,实际等要改为call的时候又发生了疑问。socket

由于call的确有以下做用:测试

1. 阻塞客户端server

2. 有返回值能肯定操做是否成功,并能很好的支持测试游戏

3. 保证时序,只有call成功了,才能继续执行下一步进程

但是除此以外,还有其余好处吗?麻烦呢?文档

若是table_server 只是为一个玩家所用,那么多是合适的。io

惋惜不是,table_server 还须要广播信息,而这部分广播信息不可能放在玩家进程作,table

这样若是在调用端和被调用端都发消息,就有点冗余。ast

cast 是丢过去无论,有返回天然收到,没有返回的话,对不起你本身看着办重试(看起来更流畅?)bug

若是call timeout了,call调用的时候,到底该怎么处理?

告诉用户处理失败? 后续收到该处理的操做完成又该怎么告诉用户?

按照GenServer的文档说明,调用者要么崩溃保持干净,

要么就是try catch,并丢弃那些垃圾信息。

胡言乱语,我仍是决定应用call,而且广播消息只在桌子进程统一发。

最终还整理了simple_table的测试,以及修正Application.start(GameServer) 为 Application.start(:game_server) 的bug。

暂时到这里了,一成天都在思考call 和cast,以及思考测试的问题,搞得很疲劳。

如今TableServer没什么好测试的,若是像SimpleTable那样去测试,实在显得冗余?

若是不测,又感受不是很可靠的样子(曾经的elixir项目我是测进程的),也许是第一次采用这种测试分解方法,还不习惯吧。

代码已经发布,后续接着:

添加不翻牌、不补牌的操做加速牌局

添加玩家的操做

以及补充测试

=====================================新的想法=============================

call 大抵适用于那种call期间无需处理其余事情的调用。

像游戏这种,一般中间会有其余消息须要处理,这时候为了及时处理更新,call可能就不合适了。

我想这大概就是你们用cast的最大缘由。

引伸开来,若是连cast都显得缓慢,那可能又须要直接对socket发操做了(固然这是最后选择)。

我代码就保持call不改了(棋牌可能影响不大),我也懒得改,这个系列主要是探讨总结用的。

相关文章
相关标签/搜索