首页 > 其他分享 >Socket.D 开源输传协议的集群转发特性

Socket.D 开源输传协议的集群转发特性

时间:2024-02-17 12:45:02浏览次数:26  
标签:Socket StringEntity demoapp 开源 session 集群 new 输传 hello

1、简介

Socket.D 是基于"事件"和"语义消息""流"的网络应用层协议。底层可以依赖 TCP、UDP、KCP、WebSocket 等传输层协议。其开发背后的动机是用开销更少的协议取代超文本传输协议(HTTP),HTTP 协议对于许多任务(如微服务通信)来说效率低下。

2、Socket.D 的集群应用

在 Socket.D 的集群故事里,会有三个角色:

  • 请求者
  • 经理人(或者中间人)
  • 响应者

客户端通过 url 连接经理人后,就会成为集群的一部分。它可以是请求者,也可以是响应者。

sd:tcp://127.0.0.1:8602?@=demoapp

url 会包括:

  • 协议头(sd 表示 socket.d 协议,tcp 表示传输方案)
  • 地址与端口
  • 路径
  • 还有@参数,这个参数会申明自己的应用名字。连接经理人时,也相当于完成身份注册了。

在集群内部,相互间通过 At 进行发起向“响应者”的请求。就像:

session.send("test", new StringEntity("hello").at("demoapp"));

3、集群的四种转发

在集群的活动中,请求者会发消息给经理人,经理人根据 at name 再转发给相应的响应者。

  • 四种转发方式(单播,单播!,组播,广播):
at 描述 备注
demoapp 单播 给叫这个名的其中一个会话发(使用 平均轮询 “负载均衡”策略)
demoapp! 单播! 给叫这个名的其中一个会话发(使用 ip_hash “负载均衡”策略)
demoapp* 组播 给叫这个名的整组会话发(如果自己也叫这个名,则自己除外)
* 广播 给集群里的全部会话发(自己除外)
  • 通过at方式进行转发,示例:
session.send("test", new StringEntity("hello").at("demoapp"));
session.send("test", new StringEntity("hello").at("demoapp!"));
session.send("test", new StringEntity("hello").at("demoapp*"));
session.send("test", new StringEntity("hello").at("*"));

4、演示

假设经理人(或者中间人) 的服务地址为:127.0.0.1:8602。下面以 Java 语言展示效果:

  • 创建经理人
public class BrokerDemo {
    public static void main(String[] args) throws Exception {
        SocketD.createServer("sd:tcp")
                .config(c -> c.port(8602).fragmentHandler(new BrokerFragmentHandler()))
                .listen(new BrokerListener())
                .start();
    }
}
  • 创建响应者(自己不需要端口启动,连接经理人后即可提供服务)
public class ResponderDemo {
    public static void main(String[] args) throws Exception {
        //连接到 broker ,并给自己命名为:demoapp
        ClientSession session = SocketD.createClient("sd:tcp://127.0.0.1:8602?@=demoapp")
                .listen(new EventListener().doOn("/hello", (s,m)->{
                    //监听 "/hello" 事件,如果是请求则答复
                    if(m.isRequest()){
                        s.reply(m, new StringEntity("me too!"));
                    }
                }))
                .open();
    }
}
  • 创建请求者
public class RequesterDemo {
    public static void main(String[] args) throws Exception {
        //连接到 broker ,并给自己命名为:demotester
        ClientSession session = SocketD.createClient("sd:tcp://127.0.0.1:8602?@=demotester")
                .open();

        //发送消息,并要求转发给 "demoapp"
        session.sendAndRequest("/hello", new StringEntity("").at("demoapp")).thenReply(r->{
            //收到答复后,打印结果
            print(r.dataAsString());
        });
    }
}

标签:Socket,StringEntity,demoapp,开源,session,集群,new,输传,hello
From: https://www.cnblogs.com/noear/p/18017888

相关文章

  • 书生开源大模型训练营-第4讲-笔记
    1、FineTune简介1.1、为什么要微调?大语言模型有各行各业的通用知识,但具体深入到某个领域,模型表现不尽如人意,需要微调1.2、两种微调:增量预训练和指令微调1.4、增量预训练:给模型投喂额外的特定领域的知识语料,模型在新的语料上继续学习训练。1.5、指令微调:基座模型学习到到是在须......
  • 书生开源大模型训练营-第3讲-笔记
    1、大模型的局限性a、知识只能截止到训练时间;b、垂直领域的专业能力有限;c、训练成本高,定制化成本高; 2、解决大模型局限性的两种思路RAGVSFTRAG:外挂一个知识库,通过检索得到文档,再将检索到文档和问题一起输入给大模型来生成答案。优点:成本极低、知识可更新;缺点:受限于基座大......
  • 开源免费的专注于建立大型个人知识库推荐-Trilium Notes
        TriliumNotes是一个分层的笔记应用程序,专注于建立大型个人知识库。支持相当丰富的markdown,包括mermaid和latex,而且即时渲染,和typora一样。支持代码类型的笔记,有高亮。 Trilium与其说是笔记软件,不如说是个人wiki。个人知识数据库、收藏夹、代码块、手账、思......
  • dlt开源数据加载工具
    dlt是一个开源数据加载工具,基于python开发特点一个库 dlt就是一个python包,其他地方需要我们自己开发非黑盒系统 我们可以基于代码灵活的进行自定义开发基于乘法的玩法,而不是加法自动代码生成 包含了类似dbt的一些处理cli基于python的玩法 dlt对于数据的处理是基于......
  • tcp ip socket seer agv 连接
    Dotnet.Seer/SeerSocket.csusingSystem.Net;usingSystem.Net.Sockets;usingSystem.Runtime.InteropServices;namespaceSeer.SeerSocket;publicstructSeerMessageHead{publicbytesync;//0x5Apublicbyteversion;//0x01publicushortnumbe......
  • Lag-Llama:第一个时间序列预测的开源基础模型介绍和性能测试
    2023年10月,我们发表了一篇关于TimeGPT的文章,TimeGPT是时间序列预测的第一个基础模型之一,具有零样本推理、异常检测和共形预测能力。虽然TimeGPT是一个专有模型,只能通过API访问。但是它还是引发了对时间序列基础模型的更多研究。到了2024年2月,已经有了一个用于时间序列预测的开源......
  • 开源.NetCore通用工具库Xmtool使用连载 - OSS文件上传篇
    【Github源码】《上一篇》介绍了Xmtool工具库中的图像处理类库,今天我们继续为大家介绍其中的OSS文件上传类库。将本地文件上传到服务器是软件系统经常会遇到的需求,例如:设置用户头像,上传Excel报表等等;涉及到网络访问性能、存储空间等因素的考虑,通常我们会选择使用第三方的对象......
  • 书生开源大模型训练营-第2讲笔记
    1大模型及InternLM模型简介1.1什么是大模型?大模型=大语料+大算力+大模型参数大模型的优势在于其能够捕捉和理解数据中更为复杂、抽象的特征和关系。书读三遍,其义自见大模型的应用和发展也需要在性能、成本和道德等多个方面进行权衡和考量。1.2InternLM模型全链条开源I......
  • Vite+Vue根据环境配置Websocket地址
    前言上回说到,利用vite加载不同mode下的配置文件,可以实现不同运行环境下的参数配置。在前端应用中经常使用到Websocket,其地址同样可以在.env中间中配置。代码vite.config.ts代码的执行是在createApp之前,不可以在vite.config.ts中使用例如pinia、router等组件。可以使用import.me......
  • 解决jstack的报错:Unable to open socket file
    原文网址:​​解决jstack的报错:Unabletoopensocketfile_IT利刃出鞘的博客-CSDN博客​​简介说明本文介绍解决jstack的报错的方法,报错信息为:Unabletoopensocketfile。分享Java技术星球:​​自学精灵-IT技术星球​​详细报错信息:进程号:Unabletoopensocketfile:......