Juya Cai

跨进程程序通信是用RPC还是MQ?

笔者接触分布式系统后,经常遇到需求需要配合其他进程的服务才能完成,跨进程通信是多进程配合的基础,也是分布式系统实现的核心。最常用的跨进程通行的方式有两种:RPC(Remote Procedure Call)和MQ(Message Queue)。笔者也是经常疑惑面对何种需求时使用何种跨进程通信方式,这篇文章做出一些自己的心得。 先简单介绍一下RPC和MQ的区别点: 耦合关系:RPC中...

论为何Actor模型下在高并发下并发效率远高于传统锁同步模型

为什么Actor模型在高并发下的并发效率远高于传统锁同步模型?在高并发的环境下,大量请求访问共享资源,为保证一致性,共享资源的访问需要是同步访问,当大量请求到来时,会有大量的锁竞争,如果只是自旋锁,锁阻塞不会释放CPU资源,就导致大量的线程积压。线程积压会导致系统调度的复杂度增加,进而导致整个系统的运行效率下降。 为什么Actor下高并发不会带来这个问题呢?首先我们要知道Actor模型的核...

rpc远程服务内嵌思路

笔者最近遇到这样的需求,存在一个微服务,希望将其服务嵌入到项目代码中。怎么理解呢?就是把微服务项目当做第三方库使用,这样项目中微服务就是本地调用,并且依赖的中间件资源也可以使用本地的。 如何设计微服务能够做到既能独立部署,又能嵌入到项目中呢?在这里,笔者不得不再次感叹go的interface的强大。通过interface就可以实现,实际上grpc框架已经提前考虑这个问题,其暴露出来的大部分...

分布式消息通知套件架构及解决方案

分布式环境下,一个系统内的多个服务部署在不同的进程上,这些服务的通信方式多种多样,这里来介绍下消息订阅通知模式下的服务通知方式实现方案。 首先需要明晰一个分布式消息通知套件需要具备的能力: 订阅广播能力 订阅单播能力 对于组播能力,本身订阅就是组播。 接下来就是对这个套件选择底层框架,分布式订阅通知中间件通常使用消息队列,一般使用kafka,rabbitmq,nats等。 ...

层级时间轮系统 / Hierarchical Time Wheel System

笔者平时的开发经常与定时任务打交道,不管是重复执行定时任务,还是一次性定时任务。由于系统存在数量级极大的定时任务,简单得通过timer来完成定时任务的需求显然是不合理的,笔者平时的项目开发会对RusselLuo的timingwheel库进行二次封装使用。不满足只是使用,正好笔者最近闲时较多,就抽空看了看timingwheel的源码,写篇博客记录我的学习和发现。 定时任务系统的发展历程 想...

时间同步机制

读者知道游戏客户端连接游戏服务端发送的第一个请求是什么吗?没错,是发送一个请求以获取服务端的发送回复的时间戳。这个请求的逻辑很简单,客户端发送ServerTime请求,服务端收到请求,将收到请求的时间戳写入回复中发送给客户端。读者知道这个请求的目的是什么吗?还有,服务端会客户端的每个请求的回复都会带上时间戳。这两件事都是为了同一个目的:分布式时间同步。 时间同步机制 网络一定存在延迟性,...

ArchaiEngine启动

俗话说,命个好名,开个好头。这两天一直在想要给之后开始着手的服务引擎起个什么名字,思来想去,就命名为ArchaiEngine。Archai 在希腊语中是开始,一切的开端的意思,我希望这个项目能带动游戏服务引擎的开源热潮,能够有越来越多的优秀的服务引擎开源出来。 同时,我也在调研,服务引擎的语言选型和Actor模型选型。最终决定,语言使用Golang,因为笔者本身从事的语言也是Golang,...

基于actor框架的开箱即用的游戏服务框架开源项目开启动声明

转眼进入游戏开发行业已经三个多月了,笔者身处的领域是游戏后端开发;虽然只是实习,但是对于游戏后端开发领域的一些现状有一些想法。读者可以把这篇文章当做吐槽文哈哈哈。 与互联网后端的差异 大学期间,笔者接触的大多是互联网后端相关和底层工具的开发,对游戏后端不甚了解,在有幸进入该领域后发现与互联网存在比较大的差异。 互联网后端服务大多是无状态的,从客户端传来的数据不会在内存停留太久,处理完后...