rpc远程服务内嵌思路
笔者最近遇到这样的需求,存在一个微服务,希望将其服务嵌入到项目代码中。怎么理解呢?就是把微服务项目当做第三方库使用,这样项目中微服务就是本地调用,并且依赖的中间件资源也可以使用本地的。 如何设计微服务能够做到既能独立部署,又能嵌入到项目中呢?在这里,笔者不得不再次感叹go的interface的强大。通过interface就可以实现,实际上grpc框架已经提前考虑这个问题,其暴露出来的大部分...
笔者最近遇到这样的需求,存在一个微服务,希望将其服务嵌入到项目代码中。怎么理解呢?就是把微服务项目当做第三方库使用,这样项目中微服务就是本地调用,并且依赖的中间件资源也可以使用本地的。 如何设计微服务能够做到既能独立部署,又能嵌入到项目中呢?在这里,笔者不得不再次感叹go的interface的强大。通过interface就可以实现,实际上grpc框架已经提前考虑这个问题,其暴露出来的大部分...
分布式环境下,一个系统内的多个服务部署在不同的进程上,这些服务的通信方式多种多样,这里来介绍下消息订阅通知模式下的服务通知方式实现方案。 首先需要明晰一个分布式消息通知套件需要具备的能力: 订阅广播能力 订阅单播能力 对于组播能力,本身订阅就是组播。 接下来就是对这个套件选择底层框架,分布式订阅通知中间件通常使用消息队列,一般使用kafka,rabbitmq,nats等。 ...
笔者平时的开发经常与定时任务打交道,不管是重复执行定时任务,还是一次性定时任务。由于系统存在数量级极大的定时任务,简单得通过timer来完成定时任务的需求显然是不合理的,笔者平时的项目开发会对RusselLuo的timingwheel库进行二次封装使用。不满足只是使用,正好笔者最近闲时较多,就抽空看了看timingwheel的源码,写篇博客记录我的学习和发现。 定时任务系统的发展历程 想...
读者知道游戏客户端连接游戏服务端发送的第一个请求是什么吗?没错,是发送一个请求以获取服务端的发送回复的时间戳。这个请求的逻辑很简单,客户端发送ServerTime请求,服务端收到请求,将收到请求的时间戳写入回复中发送给客户端。读者知道这个请求的目的是什么吗?还有,服务端会客户端的每个请求的回复都会带上时间戳。这两件事都是为了同一个目的:分布式时间同步。 时间同步机制 网络一定存在延迟性,...
俗话说,命个好名,开个好头。这两天一直在想要给之后开始着手的服务引擎起个什么名字,思来想去,就命名为ArchaiEngine。Archai 在希腊语中是开始,一切的开端的意思,我希望这个项目能带动游戏服务引擎的开源热潮,能够有越来越多的优秀的服务引擎开源出来。 同时,我也在调研,服务引擎的语言选型和Actor模型选型。最终决定,语言使用Golang,因为笔者本身从事的语言也是Golang,...
转眼进入游戏开发行业已经三个多月了,笔者身处的领域是游戏后端开发;虽然只是实习,但是对于游戏后端开发领域的一些现状有一些想法。读者可以把这篇文章当做吐槽文哈哈哈。 与互联网后端的差异 大学期间,笔者接触的大多是互联网后端相关和底层工具的开发,对游戏后端不甚了解,在有幸进入该领域后发现与互联网存在比较大的差异。 互联网后端服务大多是无状态的,从客户端传来的数据不会在内存停留太久,处理完后...
问题发现 使用之前的任务队列,发现服务器在负载高的情况下,会出现协程死锁的情况(协程无法正常退出,一般表现为空转循环)。刚开始怀疑是任务调度出现问题,怀疑任务数和队列实际len不一致导致的任务调度器一直认为存在任务,导致忙转。 针对这个问题也进行了一些处理,但是后面发现是底层环形队列存在实现上的问题。环形队列push操作,在检查到len == size后,会触发扩容。扩容逻辑存在错误,会导...
如果读者所在的领域是后端,应该对消息队列并不陌生。存在这样一种队列,它内部也是消息队列,但会对消息执行处理函数,这样的队列就被称为任务队列。 为什么要在本篇文章介绍任务队列呢?可能大部分读者认为任务队列的作用就是提供异步执行的手段,其实并不然,任务队列甚至可以成为系统并发机制的核心。这并不是本篇文章介绍的重点,笔者会在之后的文章中介绍如何依托任务队列来实现系统的并发机制。 在介绍如何实现...
如果读者喜欢阅读出名的框架或者中间件的源码,会发现质量高的代码中,对于结构体的创建往往只需要传入相同的参数即可,非常的简洁直观。 func NewServer(opt ...ServerOption) // 摘抄于GRPC框架源码 下面来介绍一下这种创建方式—高级配置模式。 高级配置模式 Option Mode 结构体中需要通过外部传入参数来进行初始化的参数可以抽象成Options...