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());
});
}
}
Socket.D 开源输传协议的集群转发特性的更多相关文章
- MapReduce中使用SequenceFile的方式上传文件到集群中
如果有很多的小文件,上传到HDFS集群,每个文件都会对应一个block块,一个block块的大小默认是128M,对于很多的小文件来说占用了非常多的block数量,就会影响到内存的消耗, MapRedu ...
- 编写hadoop程序并打成jar包上传到hadoop集群运行
准备工作: 1. hadoop集群(我用的是hadoop-2.7.3版本),这里hadoop有两种:1是编译好的hadoop-2.7.3:2是源代码hadoop-2.7.3-src: 2. 自己的机器 ...
- 分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型
分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型 分布式缓存特性: 1) 高性能:当传统数据库面临大规模 ...
- 『开源』Slithice 2013 服务器集群 设计和源码
相关介绍文章: <『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布> <『集群』001 Slithice 服务器集群 概述> <『集群』002 Sli ...
- Clusternet:一款开源的跨云多集群云原生管控利器!
作者 徐迪,Clusternet 项目发起人,腾讯云容器技术专家. 摘要 Clusternet (Cluster Internet)是一个兼具多集群管理和跨集群应用编排的开源云原生管控平台,解决了跨云 ...
- socket.io搭配pm2(cluster)集群解决方案
socket.io与cluster 在线上系统中,需要使用node的多进程模型,我们可以自己实现简易的基于cluster模式的socket分发模型,也可以使用比较稳定的pm2这样进程管理工具.在常规的 ...
- 本地开发spark代码上传spark集群服务并运行
打包 :右击.export.Java .jar File 把TestSpark.jar包上传到spark集群服务器的 spark_home下的myApp下: 提交spark任务: cd /usr/lo ...
- Redis(十)集群:Redis Cluster
一.数据分布 1.数据分布理论 2.Redis数据分区 Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot=CRC16(key)&16 ...
- Redis之集群
Redis Cluster是 Redis的分布式解决方案,在3.0版本正式推出,有效地解决了Redis分布式方面的需求.当遇到单机内存.并发.流量等瓶颈时,可以采用Cluster架构方案达到负载均衡的 ...
- Solr集群的搭建以及使用(内涵zookeeper集群的搭建指南)
1 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候 ...
随机推荐
- FIFO设计
first in first out,先进先出 fifo是基于RAM进行设计的 双端口RAM设计(16*8) 如果大的RAM可以调用IP RAM的关键参数:深度和宽度 module dual_ram ...
- steam无法登陆/更新客户端
1.问题 最近CS2更新,正准备尝试游玩一下,发现提示要使用最新版本客户端,在检查steam客户端更新时,却发现检查更新失败,无法更新,有可能是丢失了某些文件导致的. (之前有过一次重新安装的经历,但 ...
- [springmvc] - 配置文件 springmvc-config.xml 和 web.xml
springmvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...
- 神经网络优化篇:详解调试处理(Tuning process)
调试处理 关于训练深度最难的事情之一是要处理的参数的数量,从学习速率\(a\)到Momentum(动量梯度下降法)的参数\(\beta\).如果使用Momentum或Adam优化算法的参数,\(\be ...
- [转帖]ORACLE等待事件:enq: TX - row lock contention
https://www.cnblogs.com/kerrycode/p/5887150.html enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待 ...
- [转帖]记一次sst文件损坏修复过程
https://tidb.net/blog/54e388c8 [2023-07-14 14:26:28]应用系统报警删除数据失败,查看日志报Region is unavailable,同时企业微信群也 ...
- [转帖]Influxdb 2.x 快速入门
Influxdb 2.x 快速入门 https://www.jianshu.com/p/268fca65f10e Influxdb是由Golang 构建的时序数据库,由于由Go语言构建使得其跨平台部署 ...
- [转帖]linux时间戳转换成时间指令_时间戳转换公式
原文地址:http://wanping.blogbus.com/logs/28663569.html 1.时间戳转换为正常显示的时间格式 Freebsd 系统下: 转换命令为: date -r 111 ...
- log4j-漏洞修复
Log4j漏洞修复 修复参考文档:https://www.cert.org.cn/publish/main/9/2021/20211215154225883558274/202112151542258 ...
- 小白学k8s(12)-k8s中PV和PVC理解
pv和pvc 什么是pv和PVC 生命周期 PV创建的流程 1.创建一个远程块存储,相当于创建了一个磁盘,称为Attach 2.将这个磁盘设备挂载到宿主机的挂载点,称为Mount 3.绑定 持久化卷声 ...