RPC,MQ,数据同步

本文档详细介绍了RPC服务治理的Dubbo、消息中间件RocketMQ以及数据同步的原理与实践。主要内容包括Dubbo的基本用法、线程模型、多注册中心等特性;RocketMQ的核心概念和适用场景;数据同步的主从复制、同步工具和Databus的使用,强调了Databus的特性和对源表的入侵。
转至元数据结尾
转至元数据起始

概述

这个文档的目的是想更清楚的展示RPC、MQ和数据同步的正确使用场景,以及正确的使用方式,最重要的是要用好!!!

在这次分享中,我会介绍几个工具,帮助大家更深入的了解JAVA程序的一些知识!

这里面部分链接使用的是cf.lefu8.com的域名,请自觉增加host配置  192.168.16.38 cf.lefu8.com

RPC服务治理-Dubbo

RPC服务基础

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

RPC服务的变迁

  1. 最开始的实现是Hessian
    Hessian 是简单的点对点调用,相互直接暴露端口和地址,底层网络默认基于HTTP协议传输,Hessian的优点是序列化后的数据量小
  2. Dubbo服务的引入
    Dubbo是一个比较完成的服务治理体系,涵盖了RPC的大部门区域。 

Dubbo精简的介绍

因为Dubbo提供的特性其实是很多的,但是在一般的应用场景里面有一些特性几乎就不会使用到,所以我这里整理里几个很基础的特性进行介绍。完整的文档点击http://dubbo.io/User+Guide-zh.htm

整理结构

主要角色有:

  1. Registry 注册中心,用于记录订阅关系,配置和路由信息等。
  2. Provider 服务提供者,接口的实现类,用于提供对外的服务调用。
  3. Consumer 服务消费者,接口的代理类,用于调用远程的服务。
  4. Monitor 监控相关的服务,非必须。统计调用情况。

服务关系由上面的几个角色来体现,但实际上还有一部分组成是Dubbo的控制台,这个后面展示!

 

基本用法

现在已经全部使用上Dubbo了,没有概念的参考资料库:

Dubbo使用指南

启动时检查

这个一般是针对消费者而言的,在启动的时候会去检查服务是否已经在注册中心注册。

文档

线程模型

是服务提供方的线程使用模型,这个很重要!

有三种线程模型:fixed,cached,limited,看看具体的线程使用情况,线程使用一定要有度!

文档

多注册中心

多注册中心可以支持服务多地部署

文档

服务分组

服务分组的概念可以在集群环境下提供更小范围的服务定义。

文档

多版本

多版本对于接口升级的平滑迁移是非常好用的。

文档

连接控制

RPC调用使用的网络连接,对性能有很大的影响。

文档

令牌验证

开启令牌验证可以防止错误的配置使用服务。

文档

关于配置需要注意的地方

  1. Dubbo的标签有部分是唯一的
  2. Dubbo的标签有部分是唯一的
  3. Dubbo的标签有部分是唯一的
  4. 方法级优先,接口级次之,全局配置再次之。
  5. 如果级别一样,则消费方优先,提供方次之。
  6. 确定唯一服务的要素是 Group+接口+Version。

关于控制台

见实际操作演示

总结

重点是如何用好Dubbo,为我们的系统提供更好的性能服务

消息中间件RocketMQ

对于消息中间件,我们的理解基本上是用来发消息的,然后接收消息进行业务处理。消息中间件的一个重要特性是系统无关性,主要用于系统间解藕。

基本用法

参考资料库:

Astrotrain(RocketMQ)基本用法

核心概念

  1. RocketMQ是一个分布式的消息中间件,不存在单点
  2. 消息堆积能力很强大
  3. RocketMQ是基于kafka的设计思想的JAVA版本实现,kafka官方文档说明documentation.html
  4. 理解订阅组的关系非常重要

总结

消息适合异步场景,消息发送者并不关心消息处理者的动作。

  1. 消息可以在多应用间实现复用,发送者定义的消息可以被多个应用以不同逻辑消费,而对发送者而言什么都不需要进行调整。
  2. 分布式的场景不支持顺序消息,顺序消息在分布式的场景里本身就不是准确的。
  3. 消息的使用难点是消息体的定义和消费逻辑的处理,确保消息之间不存在复杂的关联关系非常重要。
  4. 消息与RPC有一部分区域是重叠的,所以选择使用RPC还是消息去实现功能需要思考清楚。
  5. 订阅组和主题的自动创建功能在测试环境和生产都是关闭的,上线前一定要确认订阅组和主题存在。这个BUG一样的存在一定要切记!!!!!!!!!!
  6. 消息有很小的几率会出现重复,这个需要在业务上保证去重!

数据同步

数据同步在我们的应用系统里大概有这么三种方式:

  1. 数据库自身的同步,主从复制
  2. 同步工具
  3. Databus

这里会重点介绍即将使用到的Databus。

数据库自身的同步

在这种模式下,一般会存在一个可读可写的主库,称之为Master,然后会使用复制的技术实现1个或多个完全一致的只读备库Slave。

这是应用实现读写分离的基础。

同步工具

同步工具是个简单的异构库之前的数据同步工具,依赖数据的版本信息进行同步。

因为简单,所以功能也很有局限性,适合小数据量的表同步,可以很简单的实现不同库之间的数据同步。

对大表的同步性能影响很严重,因为是全表扫描的方式进行同步,表数据量越大效果越差。

Databus

Databus是linkedIn公司开源的一个产品,是一个分布式的数据库同步产品,说明文档在github上有:

https://github.com/linkedin/databus/wiki

架构图

Relay:

Client:

节点说明

  1. Relay        数据抓取的主体,由relay从不同数据源中抓取变更集
  2. Client        客户端,由应用实现消费监听,消费relay抓取的数据
  3. Bootstrap produce  一种特殊的客户端,也从relay抓取数据,存入Mysql库中,供应用消费很久之前的数据
  4. Bootstrap server     消费旧数据的服务提供方

Databus提供的消费能力有点类似消息中间件,可以多重消费,由应用决定数据如何处理。

Databus的特性说明

Databus的角色定位应该是数据库间数据同步的解决方案(包括异构表结构和不同数据库之间同步),它主要由两部分功能组成:一、从数据库中抓取源变更数据 二、组织化源数据供应用消费。它的主要定位是提供源数据读取能力,并将消费能力提升至应用层面,由应用去选择如何导入数据,这也是它能处理异构库和表的原因,应用去解决这些差异了。

Relay目前开源的版本里只支持Oracle的数据库数据抓取,Mysql的需要自己实现,可以基由开源项目open-replicator读取Mysql日志实现,现在着重说一下Oracle的数据抓取。

Relay并不是读取的Oracle日志实现的数据抓取,这里官方给的说明是Oracle不同版本之间的日志存在差异,基于日志的读取需要维护版本的差异,无法提供稳定的程序版本,Relay是基于数据库的undo(Flashback技术)实现的抓取,默认在源数据库中有相关的存储过程和任务在执行,同时对于源表的数据抓取需要新增一列(TXN存储变更事务号),并且提供了一个触发器,针对insert/update的语句进行变更集的记录,不影响查询,不记录删除。

也就是说Relay对源表是存在一定入侵的,同时性能也会存在损耗。

操作演示

看操作

最后的部分

这里我想给大家展示一下我对现在系统架构的一个理解:

  1. 最上面两层是负载和分发,基本跟开发没多大关系
  2. APP层是我们主要的产出,上下层都是为这一层服务的
  3. 数据库层是最早会出现性能问题的地方,前期读写分离就很重要了。
  4. 缓存是有效提升性能的手段,可以大量减少数据库的访问。
  5. RPC和中间件就是应用往分布式发展的统一治理手段了。
RRQMSocket是一个整合性的、超轻量级的网络通信服务框架。它具有高并发连接、高并发处理、事件订阅、插件式扩展、多线程处理、内存池、对象池等特点,让使用者能够更加简单的、快速的搭建网络框架。在发送效率上,同步发送可达20w/s,异步发送可达60w/s。服务器在接收、处理效率上因线程数量而定。 支持环境: .NETFramework4.5及以上。 .NETCore3.1及以上。 .NETStandard2.0及以上。 支持框架: WPF Winform Blazor Xamarin Mono Unity 其他(即所有C#系) 特点: 1、对象池 对象池在RRQMSocket有很多应用,最主要的两个就是连接对象池和处理对象池。连接对象池就是当客户端成功连接时,首先会去连接对象池中找TcpSocketClient,然后没有的话,才会创建。如果哪个客户端掉线了,它的TcpSocketClient就会被回收。这也就是ID重用的原因。 然后就是处理对象池,在RRQMSocket中,接收数据的线程和IOCP内核线程是分开的,也就是比如说客户端给服务器发送了1w条数据,但是服务器收到后处理起来很慢,那传统的iocp肯定会放慢接收速率,然后通知客户端的tcp窗口,发生拥塞,然后让客户端暂缓发送。但是在RRQMSocket中会把收到的数据通过队列全都存起来,首先不影响iocp的接收,同时再分配线程去处理收到的报文信息,这样就相当于一个“泄洪湖泊”,能很大程度的提高处理数据的能力。 2、多线程 由于有处理对象池的存在,使多线程处理变得简单。在客户端连接完成时,会自动分配该客户端辅助类(TcpSocketClient)的消息处理逻辑线程,假如服务器线程数量为10,则第一个连接的客户端会被分配到0号线程中,第二个连接将被分配到1号线程中,以此类推,循环分配。当某个客户端收到数据时,会将数据排入当前线程所独自拥有的队列当中,并唤醒线程执行。 3、传统IOCP和RRQMSocket RRQMSocket的IOCP和传统也不一样的,以微软官方为例,使用MemoryBuffer开辟一块内存,然后均分,然后给每个会话分配一个区接收,等收到数据以后,再复制一份,然后把复制的数据抛出处理。而RRQMSocket是每次接收之前,从内存池拿一个可用内存块,然后直接用于接收,等收到数据以后,直接就把这个内存块抛出去了,这样就避免了复制操作,虽然只是细小的设计,但是在传输1000w次64kb的数据时,性能相差了10倍。所以也是基于此,文件传输时效率才会高。 4、数据处理适配器 相信大家都使用过其他的Socket产品,例如HPSocket,SuperSocket等,那么RRQMSocket在设计时也是借鉴了其他产品的优秀设计理念,数据处理适配器就是其中之一,但和其他产品的设计不同的是,RRQMSocket的适配器功能更加强大,它可以无视真实的数据,而模拟出想要的数据,例如:可以对数据进行预处理,从而解决数据分包。粘包的问题,也可以直接解析HTTP协议,经过适配器处理后传回一个HttpRequest对象等。 5、粘包、分包解决 在RRQMSocket中处理TCP粘包、分包问题是非常简单的。只需要更改不同的数据处理适配器即可。例如:使用固定包头,只需要给TcpSocketClient和TcpClient赋值FixedHeaderDataHandlingAdapter的实例即可。同样对应的处理器也有固定长度、终止字符分割等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值