Infrastrcture: RPC and threads

为什么要选择 Go 语言?

  • 通过 gogoroutine 对并发有很好的支持;
  • 简易的 RPC 框架;
  • 类型安全(相对于 jspython 这类的脚本语言);
  • 自动垃圾回收(没有 UAF 漏洞);
  • 相对简单的语法(工业界需要一个像 python 一样简单语法的编译型语言);

多线程的挑战:

  • Share Data:Golang 中使用 sync.Mutex,尽量避免共享可变量;
  • Coordination:Glang 使用 channelsync.CondWaitGroup
  • Deallock:线程间的循环等待;

lock/channel 应该在什么时候?

  • 一个结论是:大部分的多线程问题可以通过上面两个工具解决;
  • 什么时候使用哪个工具取决于程序员的思考,一个建议是:
    • state 状态共享时:使用 lock
    • communication 线程间信息交流时:使用 channel

RPC:Remote Procedure Call;

  • Client “best effort”:当服务端无响应时,多进行几次尝试后抛出异常;
  • Server “at most once”:客户端对每次请求添加 xid 唯一表示,服务端通过 xid 去重;