- 博客(62)
- 资源 (8)
- 收藏
- 关注
原创 ASCH区块链防数据篡改的情景演示
背景:部署三个节点(A/B/C)的区块链,对节点A上的数据库直接进行修改,将用户Ⅰ的balance和u_balance由1000增加修改成2000,另外两个节点(B、C)上面的数据保持不变,仍然是1000。数据篡改之后的现象:用户Ⅰ登陆节点A的系统,查看余额为2000;而登陆节点(B/C)的系统,查看余额为1000。交易操作:用户Ⅰ登陆节点A的系统,然后发起向用户Ⅱ转账1500的操作,转账
2018-01-31 10:03:29
1232
转载 如何保障微服务架构下的数据一致性
随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台。就像前边的文章说的,微服务架构为业务开发带来了诸多好处的同时,例如单一职责、独立开发部署、功能复用和系统容错等等,也带来一些问题。例如上手难度变大,运维变得更复杂,模块之间的依赖关系更复杂,数据一致性难以保证,等等。但是办法总是比问题多,本篇文章就来介绍一下我们是如何保障微服务架构的数据一致性的。
2017-09-15 09:04:16
7333
原创 RocketMQ——其他注意事项
1 消息过滤的方式1、简单消息过滤。订阅时指定topic下面tags;2、高级消息过滤。2.1)Broker所在的机器会启动多个FilterServer过滤进程;2.2)Consumer启动后,会向FilterServer上传一个过滤的Java类;2.3)Consumer从FilterServer拉消息,FilterServer将请求转发给Broker,FilterServer从Broker收到消息
2017-08-11 09:23:12
1643
原创 RocketMQ——Consumer篇:PULL模式下的消息消费(DefaultMQPullConsumer)
1 应用层的使用方式在应用层初始化DefaultMQPullConsumer类,然后调用该类的start方法启动Consumer;接下来的消费步骤如下:1、调用DefaultMQPullConsumer.fetchSubscribeMessageQueues(String topic)方法,根据topic获取对应的MessageQueue(即可被订阅的队列),在该方法中最终通过调用MQAdminIm
2017-08-11 09:20:13
7250
原创 RocketMQ——Consumer篇:PULL消费模式下的调度消费服务
与PUSH模式相比,PULL模式需要应用层不间断地进行拉取消息然后再执行消费处理,提高了应用层的编码复杂度,为了Pull方式的编程复杂度,RocketMQ提供了调度消费服务(MQPullConsumerScheduleService),在topic的订阅发送变化(初次订阅或距上次拉取消息超时)就触发PULL方式拉取消息。1 应用层使用方式该类是PULL模式下面的调度服务,当RebalanceImp
2017-08-11 09:12:20
5657
原创 RocketMQ——Consumer篇:PUSH模式下消费消息(顺序和并发两种)
1 接受并处理Broker返回的响应消息当发送拉取消息在Broker返回响应消息之后调用NettyRemotingAbstract.processMessageReceived(ChannelHandlerContext ctx, RemotingCommand msg)方法,大致逻辑如下:1、根据返回的响应对象RemotingCommand的opaque(请求序列号)从NettyRemotingA
2017-08-11 09:00:45
6589
原创 RocketMQ——Consumer篇:PUSH模式下的消息拉取(DefaultMQPushConsumer)
DefaultMQPushConsumerImpl中各个对象的主要功能如下:RebalancePushImpl:主要负责决定,当前的consumer应该从哪些Queue中消费消息;1)PullAPIWrapper:长连接,负责从broker处拉取消息,然后利用ConsumeMessageService回调用户的Listener执行消息消费逻辑;2)ConsumeMessageService:实现所谓
2017-08-11 08:48:26
8987
3
原创 RocketMQ——Consumer篇:PUSH模式下拉取消息服务的线程(PullMessageService)
只有在PUSH模式下才会使用PullMessageService服务线程,该线程主要是对pullRequestQueue:LinkedBlockingQueue<PullRequest>队列进行监测,处理该队列中的PullRequest请求对象;同时该线程也提供了两种拉取方式,分别是立即拉取和延迟拉取两种;1 拉取消息的处理逻辑在该线程的run方法中,循环地不间断地从pullRequestQueue
2017-08-11 08:27:58
2395
2
原创 RocketMQ——Consumer篇:向Broker同步消费进度的定时任务
每隔5秒调用一次MQClientInstance.persistAllConsumerOffset()方法将消费进度向Broker同步。遍历MQClientInstance.consumerTable: ConcurrentHashMap变量。对于PushConsumer端和PullConsumer端,处理逻辑是一样的,以DefaultMQPushConsumerImpl为例,调用DefaultM
2017-08-10 17:26:26
4431
原创 RocketMQ——Consumer篇:启动过程
RocketMQ提供了两种消费模式,PUSH和PULL,大多数场景使用的是PUSH模式,这两种模式分别对应的是DefaultMQPushConsumer类和DefaultMQPullConsumer类。PUSH模式实际上在内部还是使用的PULL方式实现的,通过PULL不断地轮询Broker获取消息,当不存在新消息时,Broker会挂起PULL请求,直到有新消息产生才取消挂起,返回新消息。故此处主要讲
2017-08-09 09:11:17
11933
原创 RocketMQ——Producer篇:其他功能介绍
1 向Broker发送心跳消息1、初始化HeartbeatData对象,将该Producer或Consumer的ClientID赋值给HeartbeatData对象的clientID变量;2、遍历MQClientInstance.consumerTable: ConcurrentHashMap<String/* group */, MQConsumerInner>变量,根据每个MQConsumer
2017-08-09 09:10:05
1618
原创 RocketMQ——客户端篇:Producer/Consumer的实例对象
调用MQClientInstance.start方法启动MQClientInstance对象;大致逻辑如下:1、检查MQClientInstance.ServiceState的状态(初始化状态为ServiceState.CREATE_JUST);只有状态为CREATE_JUST时才启动该Producer;其他状态均不执行启动过程;2、将MQClientInstance的ServiceState置为s
2017-08-09 09:08:18
1689
原创 RocketMQ——Producer篇:启动过程
在应用层初始化DefaultMQProducer的过程中,以Producer名称或者RPCHook的任一个或两个作为参数初始化DefaultMQProducer对象,内部以这些参数初始化了DefaultMQProducerImpl对象,其中,RPCHook是接口,由业务层来实现doBeforeRequest和doAfterResponse方法。在初始化之后对DefaultMQProducer对象设置
2017-08-09 09:06:51
2497
原创 RocketMQ——从NameServer更新客户端订阅的topic路由信息
由Producer或Consumer端调用MQClientInstance. updateTopicRouteInfoFromNameServer()方法的目的主要有:1)从NameServer获取该客户端订阅的每个topic的相关信息(包括每个topic对应的Broker信息和topic配置信息),用TopicRouteData对象表示;并将该对象信息存入MQClientInstance.topi
2017-08-09 09:03:54
2102
1
原创 RocketMQ——Producer篇:发送事务消息
该事务消息是指Producer端的业务逻辑处理与向MQ发送消息事件是在同一个事务里面,即这两件事件要么同时成功要么同时失败。 可以解决如下类似场景的问题:A用户和B用户的账户体系不在同一台服务器上面,现在A用户向B用户转账100元,为了提高执行效率,就采用消息队列的方式实现异步处理。大致逻辑是A用户扣款100元,然后发送消息给消息队列,B用户的程序从队列中获取转账信息并向B用户上账100元。 若
2017-08-09 08:56:43
4159
原创 RocketMQ——Producer篇:发送顺序消息
顺序消息主要是指局部顺序,即生产者通过将某一类消息发送至同一个队列来实现。与发生普通消息相比,在发送顺序消息时要对同一类型的消息选择同一个队列,即同一个MessageQueue对象。 目前RocketMQ定义了选择MessageQueue对象的接口MessageQueueSelector,里面有方法select(final List mqs, final Message msg, final Ob
2017-08-09 08:56:05
2901
1
原创 RocketMQ——Producer篇:发送定时消息
目前只支持固定精度级别的定时消息,服务器按照1-N定义了如下级别: “1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h”;若要发送定时消息,在应用层初始化Message消息对象之后,调用Message.setDelayTimeLevel(int level)方法来设置延迟级别,按照序列取相应的延迟级别,例如level=2,则延迟为5
2017-08-09 08:55:29
6173
原创 RocketMQ——Producer篇:发送普通消息
以DefaultMQProducer.send(Message msg)方法为例,讲解Producer消息的发送逻辑,该方法最终调用DefaultMQProducerImpl.sendDefaultImpl(Message msg, CommunicationMode communicationMode, SendCallback sendCallback, long timeout)方法完成消息的
2017-08-09 08:53:54
4813
2
原创 RocketMQ——Broker篇
1 Broker的初始化过程调用BrokerController对象的initialize方法进行初始化工作。大致逻辑如下:1、加载topics.json、consumerOffset.json、subscriptionGroup.json文件,分别将各文件的数据存入TopicConfigManager、ConsumerOffsetManager、SubscriptionGroupManager对
2017-08-09 08:47:34
11433
3
原创 RocketMQ——Name Server篇
1 NameServer的功能1、每个Broker启动的时候会向Namesrv发送注册请求,Namesrv接收Broker的请求注册路由信息,NameServer保存活跃的broker列表,包括Master和Slave;2、用来保存所有topic和该topic所有队列的列表;3、NameServer用来保存所有broker的Filter列表4、接收client(Producer和Consumer)的
2017-08-08 17:48:36
8127
原创 RocketMQ存储篇——事务消息相关的文件
在RocketMQ-3.1.9版本中,有TransactionStateService类,用于存储每条事务消息的状态。在该类中有两个成员变量tranRedoLog:ConsumeQueue和tranStateTable: MapedFileQueue,其中tranRedoLog变量用于事务状态的Redolog,当进程意外宕掉,可通过redolog恢复所有事务的状态,tranStateTable变量用
2017-08-08 17:45:55
1052
原创 RocketMQ存储篇——HA高可用
在集群模式的部署方式中,Master与Slave配对是通过指定相同的brokerName参数来配对,Master的BrokerId必须是0,Slave的BrokerId必须是大于0的数。一个Master下面可以挂载多个Slave,同一个Master下的多个Slave通过指定不同的BrokerId来区分。有4种部署方式: 部署方式 优点 缺点 备注 单个Master模式 一旦Br
2017-08-08 17:43:46
10793
1
原创 RocketMQ存储篇——数据文件的访问入口(DefaultMessageStore)
1 根据topic和queueId查找ConsumeQueue(findConsumeQueue)调用findConsumeQueue(String topic, int queueId)方法获得,从ConsumeQueue集合consumeQueueTable: ConcurrentHashMap2 根据物理偏移量和数据大小获取消息内容(lookMessageByOffset)调用lookMess
2017-08-08 17:39:13
1581
原创 RocketMQ存储篇——Config文件以及执行延迟消息的线程服务
在$HOME\store\config目录下面存储各类config文件,包括:consumerOffset.json、delayOffset.json、subscriptionGroup.json、topics.json四类config文件。 topics.json文件由TopicConfigManager类解析并存储;存储每个topic的读写队列数、权限、是否顺序等信息。 consumerOf
2017-08-08 17:33:15
2236
1
原创 RocketMQ存储篇——IndexFile和IndexService
1 IndexFile为操作Index文件提供访问服务,Index文件的存储位置是:$HOME \store\index\${fileName},文件名fileName是以创建时的时间戳命名的,文件大小是固定的,等于40+500W*4+2000W*20= 420000040个字节大小。 1.1 Index文件的数据结构 Index Header结构各字段的含义:beginT
2017-08-08 17:29:12
4243
原创 RocketMQ存储篇——Consumequeue
Consumequeue类对应的是每个topic和queuId下面的所有文件。Consumequeue类文件的存储路径默认为$HOME/store/consumequeue/{topic}/{queueId}/{fileName},每个文件由30W条数据组成,每条数据的结构如下图所示: 消息的起始物理偏移量physical offset(long 8字节)+消息大小size(int 4字节)+ta
2017-08-08 17:23:21
6408
原创 RocketMQ存储篇——CommitLog
commitlog文件的存储地址:$HOME\store\commitlog\${fileName},每个文件的大小默认1G =1024*1024*1024,commitlog的文件名fileName,名字长度为20位,左边补零,剩余为起始偏移量;比如00000000000000000000代表了第一个文件,起始偏移量为0,文件大小为1G=1073741824;当这个文件满了,第二
2017-08-08 17:04:09
21815
4
原创 RocketMQ存储篇——MapedFileQueue
1.3 MapedFileQueue应用层访问commitlog和consumequeue文件是通过MappFileQueue来操作MapedFile类,从而间接操作磁盘上面的文件;MappFileQueue是由多个MapedFile队列组成的,该类的结果如下图所示。 功能清单如下:1.3.1 获取在某时间点之后更新的文件(getMapedFileByTime) 方法getM
2017-08-08 16:55:35
1304
原创 Dubbo——扩展点加载机制
扩展点加载机制 只有标有@SPI注解的接口类才会查找扩展点的实现,依次从下面这三个路径读取扩展点文件:META-INF/dubbo/internal 、META-INF/dubbo/ 、META-INF/services/,其中dubbo内部实现的各种扩展文件都放在META-INF/dubbo/internal目录下面。 以com.alibaba.dubbo.rpc.ProxyFac...
2017-05-15 17:17:32
4689
1
原创 Dubbo——服务治理
服务治理Dubbo提供了集群部署、路由、负载均衡等容错机制,在客户端引用服务时,由MockClusterInvoker封装具体的集群策略类,默认是FailoverCluster类,具体逻辑见《4.4.2 远程引用服务》部分。由集群策略类将Directory中的多个Invoker伪装成一个Invoker,对上层调用端是透明的,不同的集群策略有不同的处理方式。主要流程基本是一致的。1)首先调用Mock...
2017-05-15 17:04:27
12013
2
原创 Dubbo——过滤器链
过滤器链各类协议protocol类均是由ProtocolFilterWrapper类封装的,ProtocolFilterWrapper在服务的暴露与引用的过程中根据KEY是PROVIDER还是CONSUMER来构建服务提供者与消费者的调用过滤器链。ProtocolFilterWrapper的export和refer方法代码如下:构建过滤器链的方法是buildInvokerChain,代码如下:在构...
2017-05-15 16:55:51
1994
原创 Dubbo——监听器链
监听器链 各类协议protocol类均是由ProtocolListenerWrapper类封装的,在服务的暴露和引用过程中,都是调用该类的export和refer方法,在这些方法中完成监听器链的创建。一、ExporterListenerProtocolListenerWrapper是在服务暴露时构建了监听器链,在服务暴露(exporter)的过程中调用监听器所提供的回调函数,Dubbo没有实现监...
2017-05-15 16:52:32
2251
原创 Dubbo——服务端接收请求的处理流程
服务端接收请求的处理流程在创建NettyServer对象时,初始化了NettyHandler对象,该对象中的ChannlHandler赋值为NettyServer对象。在接受到消息之后,调用NettyHandler.messageReceived方法,后续的调用链为:NettyServer—>MultiMessageHandler-->HeartbeatHandler—> AllC
2017-05-15 16:49:53
1517
原创 Dubbo——消费端调用
消费端调用1、在业务层代码中调用远程接口的方法时,实际上是调用的本地创建的代理对象。即在《4.4.3 创建服务类的本地代理》中创建的代理对象。2、在该代理对象中,调用了InvokerInvocationHander.invoke方法。远程调用以Invcation、Result为中心,在这个方法中根据调用的远程方法和传入的参数构建RpcInvcation对象,该对象中的成员变量包括远程调用的方法名、...
2017-05-15 16:48:13
3840
原创 Dubbo——Transport网络传输层
Transport网络传输层1请求/响应的处理流程NettyHandler:继承netty对象SimpleChannelHandler,重写了channelConnected、channelDisconnected、messageReceived、writeRequested、exceptionCaught方法,当netty的通道发生连接、断开连接、收到消息、写入消息、捕获异常等事件时触发Nett...
2017-05-15 16:45:36
2278
原创 Dubbo——Exchange信息交换层
Exchange信息交换层1、Exchange层的类分析ReferenceCountExchangeClient:将请求交HeaderExchangeClient处理,不进行任何其他操作。HeaderExchangeClient:提供心跳检查功能;将send、request、close等事件转由HeaderExchangeChannel处理,HeaderExchangeChannel对象中的Cha...
2017-05-15 16:40:06
2047
原创 Dubbo——各协议暴露和引用服务的逻辑
各协议暴露和引用服务的逻辑 目前Dubbox版本支持的协议有dubbo、injvm、rmi、hessian、thrift、memcached、redis、rest等九种,其中memcached和redis协议只支持服务引用不支持服务暴露;这些协议有的继承AbstractProxyProtocol类,有的实现了AbstractProtocol接口。服务暴露调用export方法,引用服务调用re...
2017-05-15 16:34:55
5446
1
金融分布式账本技术安全规范.pdf
2020-02-26
RocketMQ技术讲解V2.0
2017-08-08
RocketMQ-3.2.6源码工程
2017-05-15
struts-2.3.1.2源码
2012-07-14
xwork-core-source-2.3.1.2源码
2012-07-14
struts-2.3.1.2源码依赖的所有jar包
2012-07-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人