摘要:
tiny内存分配 tiny内存分配流程: 1. 如果申请的是tiny类型,会先从tiny缓存中尝试分配,如果缓存分配成功则返回 1. 否则从tinySubpagePools中尝试分配 2. 如果上面没有分配成功则使用allocateNormal进行分配 从缓存中分配 这里以启用了缓存为例来说明,使用 阅读全文
摘要:
Netty中的内存管理应该是借鉴了FreeBSD内存管理的思想—— "jemalloc" 。Netty内存分配过程中总体遵循以下规则: 优先从缓存中分配 如果缓存中没有的话,从内存池看看有没有剩余可用的 如果已申请的没有的话,再真正申请内存 分段管理,每个内存大小范围使用不同的分配策略 我们先总体上 阅读全文
摘要:
前面经过channel初始化、注册,所需要的数据结构(epoll_event)基本上准备好了,serverSocket也处于监听状态,可以接收来自客户端的请求了。NioServerSocketChannel注册在了NioEventLoop selector,在注册过程中启动了NioEventLoop 阅读全文
摘要:
NioEventLoop功能 前面channel已经准备好了,可以接收来自客户端的请求了,NioEventLoop作为一个线程池,只有一个线程,但是有一个queue存储了待执行的task,由于只有一个线程,所以run方法是死循环,除非线程池shutdown。 这个run方法的主要作用: 1. 执行s 阅读全文
摘要:
我们在使用Netty的时候的初始化代码一般如下 前面已经说过线程池的启动过程,接下来就是通过builder模式构造启动参数,接下来看看bind的过程。channel的注册和ip:port的绑定都是在bind方法中进行的,bind方法的主要逻辑是 1. 初始化channel 2. channel注册到 阅读全文
摘要:
`说明:netty源码系列是基于4.1.25版本的netty源码的` Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo、RocketMQ。可以说Netty是对Java NIO的封装,比如ByteBuf、channel等的封装让网 阅读全文
摘要:
分布式事务是一个复杂的问题,rmq实现了事务的最终一致性,rmq保证本地事务成功消息一定会发送成功并被成功消费,如果本地事务失败了,消息不会被发送。 rmq事务消息的实现过程为: 1. producer发送half消息 2. broker确认half消息,并通知producer,表示消息已经成功发送 阅读全文
摘要:
RocketMQ本身支持顺序消息,在使用上发送顺序消息和非顺序消息有所区别 发送顺序消息 send方法带有参数MessageQueueSelector,MessageQueueSelector是让用户自己决定消息发送到哪一个队列,如果是局部消息的话,用来决定消息与队列的对应关系。 顺序消息消费 从使 阅读全文
摘要:
"上一节" 消息重试里面提到了重试的消息可以被延时消费,其实除此之外,用户发送的消息也可以指定延时时间(更准确的说是延时等级),然后在指定延时时间之后投递消息,然后被consumer消费。阿里云的ons还支持定时消息,而且延时消息是直接指定延时时间,其实阿里云的延时消息也是定时消息的另一种表述方式, 阅读全文
摘要:
RocketMQ的消息重试包含了producer发送消息的重试和consumer消息消费的重试。 producer发送消息重试 producer在发送消息的时候如果发送失败了,RocketMQ会自动重试。 上面这个方法区分出不同的消费结果: org.apache.rocketmq.client.co 阅读全文