首页 > 其他分享 >受skynet启发的分布式服务端框架设计

受skynet启发的分布式服务端框架设计

时间:2022-11-26 22:56:06浏览次数:74  
标签:调用 队列 分布式服务 host 线程 skynet 进程 id 启发

简介

不管是RPC还是IPC,本质都是通过某种寻址方式调用另一个工作单元(线程)的函数(subroutine)。

此处工作单元可以是主机(host),进程(process),线程(thread)。最终函数将在某个主机上的某个进程里的某个线程中执行。

为了简化情况,我们假设一台主机上只运行一个进程。

如果两个线程处于同一个进程(host),那么调用线程(producer)会使用一个local thread id找到对应的线程,将数据投递给被调用线程(consumer)。此时数据由于不走网络,不需要序列化操作。

如果两个线程分别位于不同的进程(host),那么调用线程(producer)会使用 global id(host id, local thread id)来找到对应进程上对应线程,将消息投递给被调用线程。此时数据会走网络,需要序列化操作。

线程服务注册中心

每个线程支持一个或多个服务,每个线程启动的时候,可以将自己的地址(ipEndPoint,localThreadID)服务注册到全局的线程服务中心。线程服务注册中心本身也是一个线程,它的地址是写死在配置信息上的,比如

(RegisterServerIPEndPoint = [127.0.0.1:23333], localThreadID=[1])

当然有些私有服务(socket, db)也是可以不注册的。

模块划分

RPCModule: invoker code | handler code

AddressModule: local address | global address

SerializerModule: none | protobuf | msgpack(compress)

调用形式

RPC.SetDst(globalID).GetService<IXXXService>().HelloWorld("good morning")
    .TCallback=()=>{};

线程队列

为了避免阻塞,一个队列只能有一个生产者和一个消费者。队列的实现见《网络发包的优化》

为了简化设计,同时保证效率,我们令每个工作线程有个发送队列(sending queue)和接收队列(receiving queue)。工作线程往发送队列中投递消息,消息包含了目的线程的地址和函数信息。一个进程(host)会有一个LocalMsgMailer线程将各个线程发送队列中的消息取出,查看地址,并放到对应的目的线程的接收队列中。如果目的线程位于另一个进程,则会将消息投递到SocketMessageWorker的接收队列中。

标签:调用,队列,分布式服务,host,线程,skynet,进程,id,启发
From: https://www.cnblogs.com/dewxin/p/16928561.html

相关文章

  • 戏说分布式服务器
    在游戏中玩家移动怎么让所有人都能看到?负载有限,如果一个场景最大只能支撑数十人,容纳上万人的场景要怎么实现同步?衍生出分布式程序:有两个玩家,分别进入不同的世界,如图代表兽人......
  • 树上启发式合并
    树上启发式合并,DSUOnTree,静态链分治,用于求解支持离线的树上子树查询问题。暴力做法,每次做完一棵树就要把它清空,避免对它兄弟造成影响,但是做到它的祖先时又会重新对它做......
  • 每次审查 OKR时,团队要讨论的12个启发性问题
    你使用OKRs(目标和关键结果)吗?它们是一种在企业内部集中精力的好方法。当生活繁忙时,很容易迷失在“嘈杂的工作“中,从而无法推动你的业务发展。一个能够帮助你深入了解重要......
  • 【分布式技术专题】「架构实践于案例分析」盘点分布式服务的(无状态\有状态)认证实现方
    ⽆状态vs有状态有状态、⽆状态是什么有状态:服务器端需要保存请求的相关信息,每个请求可以默认地使⽤以前的请求信息⽆状态:服务器端不记录请求的相关信息,服务器处理的内容完......
  • NGINX重启发生报错 nginx: [error] open() “/run/nginx.pid“ failed
    nginx[error]open()“/usr/local/var/run/nginx.pid”failed(2:Nosuchfileordirectory)nginx:[error]open()“/run/nginx.pid”failed(2:Nosuchfileord......
  • 【SA+启发式合并+主席树】P7361拜神
    题目链接由于自己感觉写不明白,先来写题解学习自Alex_wei题意给定长为\(n\leq5\times10^4\)字符串,\(q\leq10^5\)次询问,每次询问\([l,r]\)子串内出现两次以上......
  • 启发式算法(Heuristic Algorithm)的理解(通俗版)
    有两类算法可以解决优化问题: 优化(算法):保证找到最佳解决方案(如果有足够的时间和资源)是把各种可能性都一一进行尝试,最终能找到问题的答案,但它是在很大的问题空间内,花费大......
  • 《软件方法》需求启发
    第7章需求启发我不知道应该说些什么,哦……爱你在心口难开《爱你在心口难开》;词:佚名,曲:SonnyCurtis、JerryAllison,唱:凤飞飞;1981第2到第6章的内容都是关于如何思考和建模得......
  • 《软件方法》需求启发测试题
    第7章需求启发我不知道应该说些什么,哦……爱你在心口难开。《爱你在心口难开》;词:佚名,曲:SonnyCurtis、JerryAllison,唱:凤飞飞;1981第2到第6章的内容都是关于如何思考和建模......
  • 并查集的启发式合并
    背景:遇到一个题要用到,所以总结一下概述启发式合并的本质其实就是把size小的集合合并到size大的集合里面一般在需要查询并查集内元素或合并集合的时候可能会用到启发式......