Spring官方RSocket Broker 0.3.0发布: 快速构建你的RSocket架构
一 Spring RSocket Broker架构
路由节点ID(routeId): 这个是应用到broker创建的长连接的唯一标识,通常是UUID,当然也可以用户自己指定,连接的唯一性会让各个Broker集群的全局路由表处理方便很多。注意routeId是长连接的标识,不是应用的标识,应用的标识是通过tags进行标识的。如果一个应用和broker创建两条长连接,那么就有两个不同的routeId,当然这种情况下每一条连接可以提供不同的服务名称。
服务名称:这个其实就是服务的DNS Name,如果其他应用想调用该应用提供的RSocket服务,就需要指定该服务名称。虽然Spring RSocket提供了messageMapping,但是mapping的key是应用内部的,并不能保证全局唯一,只有Service Name + RSocket Mapping Key才能定位指定的服务,这个和http的原理是一致:Mapping Key类似HTTP Path,而Service Name类似域名。
标签:标签是用于标识应用提供的RSocket服务,当然RSocket Broker规范也提供了一些缺省的标签,如InstanceName, ClusterName, Region, MajorVersion等。标签不只是服务的元信息,此外还可以参与到服务路由上。如可以设置服务版本、集群名称等,之前开发中老大难的定向路由就可以通过标签轻松解决,如可以给服务打上InstanceName=app-leijuan的标签,然后在调用中设置InsanceName就可以调用某位开发者启动的服务实例。大家不用担心基于Tag的路由性能问题,背后有Roaring BitMap支持,速度非常快。
二 Spring RSocket Broker项目样例
1 RSocket Broker Server
<dependency>
<groupId>io.rsocket.broker</groupId>
<artifactId>rsocket-broker-spring</artifactId>
<version>0.3.0</version>
</dependency>
io.rsocket.broker:
uri: tcp://0.0.0.0:8001
cluster.uri: tcp://0.0.0.0:7001
2 RSocket Service Provider
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-rsocket</artifactId>
</dependency>
<dependency>
<groupId>io.rsocket.broker</groupId>
<artifactId>rsocket-broker-client-spring</artifactId>
<version>0.3.0</version>
</dependency>
io.rsocket.broker.client:
service-name: com.example.PongService
brokers:
- tcp://localhost:8001
@Controller
public class PongController {
@MessageMapping("pong")
public Mono<String> pong(String ping) {
return Mono.just("hello " + ping);
}
}
3 RSocket Service Consumer
io.rsocket.broker.client:
service-name: com.example.apps.${spring.application.name}
brokers:
- tcp://localhost:8001
@RestController
public class PortalController {
@Autowired
private BrokerRSocketRequester requester;
@GetMapping("/")
public Mono<String> index() {
return requester.route("pong")
.address("com.example.PongService")
.data("ping")
.retrieveMono(String.class);
}
}
@RSocketBrokerClient
interface GreetingClient {
@MessageMapping("pong")
@ServiceAddress("com.example.PongService")
Mono<String> pong(String ping);
}
三 Spring RSocket Broker的一些思考
1 RSocket Broker特性
2 RSocket Broker中直接通讯的解决方案
spring.rsocket.server.transport: tcp
spring.rsocket.server.port: 42252
3 RSocket Broker请求等待
拒绝请求,马上返回失败:这个就是我们常说的快速失败的设计,在企业架构设计中使用的比较多。如果是采用同步通讯和Thread Pool模式,你基本上必须使用该设计,不然较长时间的线程堵塞马上让你服务无法响应请求。
等待服务上线:就是Broker先保留(hold)请求,然后等服务上线后再转发给上线的服务。这个设计有时非常有用,如在FaaS场景,Gateway上已经验证该函数是存在的,目前只是函数下线,所以触发一下函数上线然后请求等待就可以。此外还有就是网络抖动的问题,会导致连接被中断,这个时候也可以选择等待服务上线。另外还有一个场景就是服务发布,如一个长尾服务只有一个实例,只要你能在3-5秒内将应用重新启动完毕,这个时候broke就可以帮你hold住请求,再配合上客户端的retry,即便只有一个实例,也不会感觉到服务被中断。如在K8S中,将应用的镜像设置为last,然后在设置为获取最新,这样一个redploy button就可以啦。当然这个请求等待时间也不是无限长的,你可以设置一个超时时间,然后返回错误就可以。
4 消息广播模型
fireAndForget模型:如配置推送场景,将配置更新请求发给service-name对应的服务列表即可。
requestResponse模型:将请求发送给多个服务,然后将第一个响应的response返回给调用方,不论是响应的结果是成功还是失败,这个和JavaScript的Promise.race()类似。Promise.race()特性,业务上场景好像不多,为了方便理解这里添加一个timeout,将其转换为:"在指定时间内最快地将结正确的结果返回"。如在数据同步的场景中,数据会同步到多个备份服务器上,但是由于种种原因,可能导致备份服务器上的数据同步出现延迟或者丢失,于是我向多个备份服务器查询数据,并约定如果备份服务器上没有该数据,则在1秒超时后返回异常,这样就可以保证以最快的速度从备份服务器集群上拿到正确数据。当然在实际的架构中,我们会加上一层cache支持,避免同时向服务发起多个请求,浪费的资源也比较多。
requestStream模型:将请求发送给多个服务方,然后将返回的stream进行汇总,然后将合并的消息流返回给调用方。在监控的场景非常有用,你希望各个服务或应用将5分钟内的日志都汇报上来,然后进行统计,这个时候就非常有帮助。
Channel模型:连续地向多个服务方的channel发送信息,然后将发出的信息再进行汇总。如你有多个指定要发送出去,然后将各个应用上对指定的响应结果进行汇总,就可以采用这个模型。
5 Gateway和Broker
6 嵌入式的RSocket Broker
Config/Registry Server: 既然应用已经和Broker建立了长连接,元信息也都发送给Broker,所以Registry Server就水到渠成。RSocket Broker支持各种消息广播模型,所以Config Server基本也就绪啦。单个应用的配置推送,基于独立tag推送,基于Service Name整体推送,全部没有问题。
Web控制台:嵌入Broker后,再开发一个web控制台,这个对Spring Boot来说非常简单。
Data Gateway:如果你想做一个Data Gateway对外提供数据访问服务,所有data worker节点连接到Broker,然后broker对外提供服务即可。
Ops系统整合:这个使用Spring Boot整合即可,其他诸如对接入应用的健康度检查等,这个只要发一个消息给应用即可。
应用和Broker的优雅上下线:通过推送brokers的配置信息,应用可以连接到新的brokers节点上,完成brokers集群的上下线。应用的上下线,在Broker集群中发一个ROUTE_REMOVE的消息即可,然后应用在3-5后即可下线。
7 Spring RSocket Broker Client
四 总结
互联网技术实战营·数据智能专题
互联网企业数据运营正在经历从工具化到数据化,从数据化向智能化演进的转变。以数据智能驱动科学运营,洞察用户行为,优化运营策略,进而实现用户的精细化和智能化运营。
本次课程面向关注数据治理与用户增长的互娱、电商、游戏等互联网企业,特邀阿里云的技术专家分享最佳实践和解决方案,您可按需选择想要学习的课程。
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。