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


    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());
            });
        }
    }
    
  • 相关阅读:
    北汇信息继续扩大V2X测试服务,扎根重庆,服务全国
    HTML & CSS
    鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    怎样判断气门油封有问题?
    【DPDK】dpdk样例源码解析之四:dpdk-ip_reassembly
    怎么使用MATLAB编辑图像,使得细节放大
    风储VSG-基于虚拟同步发电机的风储并网系统Simulink仿真
    STS中打开Ibatis的xml文件提示错误
    Stable Diffusion 3 Early Preview发布
    CMS垃圾回收器介绍
  • 原文地址:https://www.cnblogs.com/noear/p/18017888