随笔分类 -  中间件

摘要:目录 处理写请求总体过程 客户端发起写请求 follower和leader交互过程 follower发送请求给客户端 处理写请求总体过程 zk为了保证分布式数据一致性,使用ZAB协议,在客户端发起一次写请求的时候时候,假设该请求请求到的是follower,follower不会直接处理这个请求,而是转 阅读全文
posted @ 2019-06-05 00:45 lacker 阅读(5637) 评论(0) 推荐(2)
摘要:dubbo序列化 dubbo作为一个rpc框架支持丰富的序列化方式,本文简单介绍dubbo的序列化。本文结构: 对象序列化是什么意思? dubbo序列化 几个问题 对象序列化是什意思? 先来思考两个问题: 1. 普通的Java对象的生命周期是仅限于一个JVM中的,只要JVM停止,这个对象也就不存在了 阅读全文
posted @ 2019-05-20 01:20 lacker 阅读(8471) 评论(0) 推荐(2)
摘要:zookeeper集群启动的时候,首先读取配置,接着开始选举,选举完成以后,每个server根据选举的结果设置自己的角色,角色设置完成后leader需要和所有的follower同步。上面一篇介绍了leader选举过程,这篇接着介绍启动过程中的leader和follower同步过程。 本文结构如下: 阅读全文
posted @ 2019-05-06 00:19 lacker 阅读(1748) 评论(2) 推荐(0)
摘要:上一篇介绍了zookeeper的单机启动,集群模式下启动和单机启动有相似的地方,但是也有各自的特点。集群模式的配置方式和单机模式也是不一样的,这一篇主要包含以下内容: 概念介绍:角色,服务器状态 服务器组件启动 leader选举 概念介绍:角色,服务器状态 集群模式会有多台server,每台serv 阅读全文
posted @ 2019-04-26 00:21 lacker 阅读(1330) 评论(0) 推荐(0)
摘要:`说明:zookeeper系列是基于3.6.0版本的` zookeeper一般使用命令工具启动,启动主要就是初始化所有组件,让server可以接收并处理来自client的请求。本文主要结构: main入口 配置解析 组件启动 main入口 我们一般使用命令行工具来部署zk server,zkServ 阅读全文
posted @ 2019-04-23 00:20 lacker 阅读(2378) 评论(2) 推荐(0)
摘要:Netty本身在内存分配上支持堆内存和直接内存,我们一般选用直接内存,这也是默认的配置。所以要理解Netty内存的释放我们得先看下直接内存的释放。 Java直接内存释放 我们先来看下直接内存是怎么使用的 申请的过程是其实就是创建一个DirectByteBuffer对象的过程,DirectByteBu 阅读全文
posted @ 2018-07-30 23:14 lacker 阅读(3925) 评论(0) 推荐(1)
摘要:tiny内存分配 tiny内存分配流程: 1. 如果申请的是tiny类型,会先从tiny缓存中尝试分配,如果缓存分配成功则返回 1. 否则从tinySubpagePools中尝试分配 2. 如果上面没有分配成功则使用allocateNormal进行分配 从缓存中分配 这里以启用了缓存为例来说明,使用 阅读全文
posted @ 2018-07-28 09:41 lacker 阅读(1330) 评论(0) 推荐(0)
摘要:Netty中的内存管理应该是借鉴了FreeBSD内存管理的思想—— "jemalloc" 。Netty内存分配过程中总体遵循以下规则: 优先从缓存中分配 如果缓存中没有的话,从内存池看看有没有剩余可用的 如果已申请的没有的话,再真正申请内存 分段管理,每个内存大小范围使用不同的分配策略 我们先总体上 阅读全文
posted @ 2018-07-26 23:50 lacker 阅读(3329) 评论(0) 推荐(1)
摘要:前面经过channel初始化、注册,所需要的数据结构(epoll_event)基本上准备好了,serverSocket也处于监听状态,可以接收来自客户端的请求了。NioServerSocketChannel注册在了NioEventLoop selector,在注册过程中启动了NioEventLoop 阅读全文
posted @ 2018-07-26 01:17 lacker 阅读(1056) 评论(0) 推荐(0)
摘要:NioEventLoop功能 前面channel已经准备好了,可以接收来自客户端的请求了,NioEventLoop作为一个线程池,只有一个线程,但是有一个queue存储了待执行的task,由于只有一个线程,所以run方法是死循环,除非线程池shutdown。 这个run方法的主要作用: 1. 执行s 阅读全文
posted @ 2018-07-25 00:54 lacker 阅读(2233) 评论(2) 推荐(1)
摘要:我们在使用Netty的时候的初始化代码一般如下 前面已经说过线程池的启动过程,接下来就是通过builder模式构造启动参数,接下来看看bind的过程。channel的注册和ip:port的绑定都是在bind方法中进行的,bind方法的主要逻辑是 1. 初始化channel 2. channel注册到 阅读全文
posted @ 2018-07-24 00:47 lacker 阅读(1053) 评论(0) 推荐(0)
摘要:`说明:netty源码系列是基于4.1.25版本的netty源码的` Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo、RocketMQ。可以说Netty是对Java NIO的封装,比如ByteBuf、channel等的封装让网 阅读全文
posted @ 2018-07-22 13:53 lacker 阅读(3395) 评论(0) 推荐(0)
摘要:分布式事务是一个复杂的问题,rmq实现了事务的最终一致性,rmq保证本地事务成功消息一定会发送成功并被成功消费,如果本地事务失败了,消息不会被发送。 rmq事务消息的实现过程为: 1. producer发送half消息 2. broker确认half消息,并通知producer,表示消息已经成功发送 阅读全文
posted @ 2018-05-24 23:45 lacker 阅读(2975) 评论(2) 推荐(1)
摘要:RocketMQ本身支持顺序消息,在使用上发送顺序消息和非顺序消息有所区别 发送顺序消息 send方法带有参数MessageQueueSelector,MessageQueueSelector是让用户自己决定消息发送到哪一个队列,如果是局部消息的话,用来决定消息与队列的对应关系。 顺序消息消费 从使 阅读全文
posted @ 2018-05-23 00:37 lacker 阅读(3342) 评论(0) 推荐(1)
摘要:"上一节" 消息重试里面提到了重试的消息可以被延时消费,其实除此之外,用户发送的消息也可以指定延时时间(更准确的说是延时等级),然后在指定延时时间之后投递消息,然后被consumer消费。阿里云的ons还支持定时消息,而且延时消息是直接指定延时时间,其实阿里云的延时消息也是定时消息的另一种表述方式, 阅读全文
posted @ 2018-05-10 00:05 lacker 阅读(4035) 评论(0) 推荐(1)
摘要:RocketMQ的消息重试包含了producer发送消息的重试和consumer消息消费的重试。 producer发送消息重试 producer在发送消息的时候如果发送失败了,RocketMQ会自动重试。 上面这个方法区分出不同的消费结果: org.apache.rocketmq.client.co 阅读全文
posted @ 2018-05-08 22:26 lacker 阅读(4302) 评论(0) 推荐(1)
摘要:上一篇说明了RocketMQ怎么支持broker集群的,这里接着说RocketMQ实现高可用的手段之一——冗余。 RocketMQ部署的时候一个broker set会有一个mater和一个或者多个slave,salve起到的作用就是同步master存储的的消息,并且会接收部分consumer读取消息 阅读全文
posted @ 2018-05-06 16:12 lacker 阅读(3101) 评论(1) 推荐(3)
摘要:高可用究竟指的是什么?请参考: "关于高可用的系统" RocketMQ做了以下的事情来保证系统的高可用 多master部署,防止单点故障 消息冗余(主从结构),防止消息丢失 故障恢复(本篇暂不讨论) 那么问题来了: 怎么支持多broker的写? 怎么实现消息冗余? 下面分开说明这两个问题 多mast 阅读全文
posted @ 2018-05-05 14:46 lacker 阅读(6889) 评论(0) 推荐(2)
摘要:问题 dubbo内部定制的版本中,在处理大于10K的包的时候,会出现内存溢出的现象 原因是我们在定制dubbo http协议的时候,使用了jboss包里面的HttpRequestDecoder的http decoder方法来解析http协议内容 该方法在解析非http协议的大内容时,会出现内存溢出的 阅读全文
posted @ 2018-02-05 22:20 lacker 阅读(1723) 评论(0) 推荐(2)
摘要:dubbo通过netty将请求发送到provider的时候,provider之前已经启动好的NettyServer监听指定端口的时候会收到来自consumer的请求,将通过网络发送来的二进制编码成Request交给上层处理。dubbo从Request中取出调用信息,找到之前的Invoker,然后经过 阅读全文
posted @ 2018-01-29 23:00 lacker 阅读(768) 评论(1) 推荐(2)