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.当一个系统的索引数据量少的时候 ...
随机推荐
- .NET CORE实战项目之CMS 部署篇 思维导图
.NET Core实战项目之CMS 第十七章 CMS网站系统的部署 如何优雅的利用Windows服务来部署ASP.NET Core程序
- java基础(13)--静态变量、静态代码块、实例代码块
一.静态变量/静态代码块特点: 1.类加载时执行静态代码块,并初始化静态变量 2.先于main()执行 3.只加载一次 4.可访问静态变量,不可访问实例变量 二.实例语句块: 1.需要实例化,对象 ...
- 数字IC设计全流程介绍
数字IC设计全流程设计 掌握数字集成电路设计的流程 数字设计流程中每个阶段主要做哪些工作? 数字设计流程中每个阶段使用的主要EDA工具? 数字电路常用软件公司Mentor(questasim),Syn ...
- 【BUS】动画图解嵌入式常见的通讯协议:SPI、I²C、UART、红外 ......
SPI传输 SPI数据传输 SPI数据传输 SPI时序信号 I2C传输 2C总线寻址 UART传输 PC-UART-MCU RS-232电平转换 红外控制 红外通信 红外信号接收.放大.整形 红外控制 ...
- Oracle数据库统计信息_执行计划_sharedpool等的知识梳理
Oracle数据库统计信息_执行计划_sharedpool等的知识梳理 背景 最近有项目出现了年底业务量增加时卡顿的情况. 同事多次发现执行SQL缓慢. 但是重新执行统计信息更新后问题就优化的现象. ...
- SQLServer数据库JDBC连接串参数的简单学习
SQLServer数据库JDBC连接串参数的简单学习 背景 前段时间一直跟同事一起处理SQLServer 比其他数据库的deadlock更多的问题. 涉及到了几个驱动的参数. 想着问题基本上告一段落, ...
- [转帖]TiFlash 面向编译器的自动向量化加速
作者:朱一帆 目录 SIMD 介绍 SIMD 函数派发方案 面向编译器的优化 SIMD 介绍 SIMD 是重要的重要的程序加速手段.CMU DB 组在 Advanced Database Syst ...
- [转帖]TiDB 热点问题处理
TiDB 热点问题处理 本文介绍如何定位和解决读写热点问题. TiDB 作为分布式数据库,内建负载均衡机制,尽可能将业务负载均匀地分布到不同计算或存储节点上,更好地利用上整体系统资源.然而,机制不是万 ...
- [转帖]tubostat
TURBOSTAT(8) System Manager's Manual TURBOSTAT(8) NAME turbostat - Report processor frequency and id ...
- [转帖]OutOfMemory自动重启程序
OutOfMemory以后程序已经假死,无法再提供服务,最好的做法是dump内存,发送警告,然后重启服务 我的方案:利用at命令延迟启动 但有一个问题,at最多支持分钟操作,也就是说要1分钟以后才能启 ...