Netty

Netty-HashedWheelTimer-源码学习

孤人 提交于 2020-08-10 05:26:14
未完待续 引入: 详解了时间轮的用法: https://www.zhihu.com/question/361018720/answer/937510941 时间轮的来由【10w定时任务,如何高效触发超时】: https://blog.csdn.net/qijiqiguai/article/details/78606877 1. 为啥需要它? 需求:最近要搞IM,里面有个需求,15秒不发消息,判断用户下线。 经过探讨总共得到两种方法: 对个每个用户开启一个定时器,15秒后启动它,并判断用户是否下线。 很显然,这不现实,每个定时器都需要一个线程 将每个用户最后的请求时间戳缓存下来,然后开启一个定时器,轮询每个用户,判断其是否超时。 仅启动一个定时器,非常nice,但是问题是需要轮询每个用户,也许应该用多个定时器来处理,但是这都无法改变一个问题,需要轮询大量无关用户,有没有办法解决这个问题? 这个两个方法引出了核心需求: 我希望定时器每次启动都只对需要操作的对象操作。即对可能已经失效的用户来操作。 这个需求的核心问题在于 按照时间对任务排序 。 那为什么要用所谓的时间轮结构?普通队列它不香吗?或者说HashedWheelTimer和java.util.Timer的差别在哪里? 1. 从性能上考虑,(主要体现在插入任务的过程) : 明显HashedWheelTimer占优。

redis 队列实现

爱⌒轻易说出口 提交于 2020-08-10 04:19:16
现有项目需要做一个长连接通讯,我打算采用netty+通讯队列实现, 通讯队列最初打算用rabbitMQ或者kafaka,但是考虑到实施的同事的项目部署的问题,就该为现有的redis了,采用的是redis队列 @Component public class RedisClient { private static Logger logger = LoggerFactory.getLogger(RedisClient.class); @Autowired private RedisTemplate<Object, Object> redisTemplate; /** ---------------------------------- redis消息队列 ---------------------------------- */ /** * 存值 * @param key 键 * @param value 值 * @return */ public boolean lpush(String key, Object value) { try { redisTemplate.opsForList().leftPush(key, value); return true; } catch (Exception e) { logger.error("e:",e); return false; }

我的另一种参与 RocketMQ 开源社区的方式

橙三吉。 提交于 2020-08-10 00:42:11
首先先“SHOW”一波我在 RocketMQ 开源社区所获得的成就:2019年RocketMQ社区授予我优秀布道师荣誉称号,证书很高大上,奖品丰厚哦。 布道师是什么?开源项目不是都在追求如何成为一名 Committer?其实这个就是参与开源项目的两种不同方式。如何参与一个开源项目,容我慢慢道来。 1、与 RocketMQ 相识、相知到“在一起” 在2017年听到阿里巴巴将 RocketMQ 捐赠给 Apache基金会成为 Apache 的顶级项目,我内心是无比激动,因为终于可以一睹一款高性能的消息中间件的实现原理。 通过阅读 RocketMQ 官方文档,以下几个特别的点吸引了我的注意,让我下定决心深入研究一番。 RocketMQ 为什么性能高效,到底运用了什么“厉害”的技术 RocketMQ 如何实现刷盘(可以类比一下数据库方面的刷盘、redo、undo日志) RocketMQ 文件存储设计理念、基于文件的 Hash 索引是怎么实现的 定时消息、消息过滤等实现原理 如何进行网络编程(Netty实战) 心动不如行动,下定决心后便开始了我的源码分析 RocketMQ 之旅,大概在4个多月的时间中连续发表了30余篇文章,从 Nameserver、消息发送高可用设计、消息存储、消息消费、消息过滤、事务消息等各个方面对其进行了体系化的剖析,边写边分享,边分享边传播

在 Google,Java 程序员的一天是如何工作的

落花浮王杯 提交于 2020-08-09 20:15:04
1. 严格遵守“Google Style”,这份“Google Style”会有详细的文档清楚地告诉你如何编码(一开始你会觉得很痛苦,但是以后你会享受它带来的好处) 2. 非常严格的代码审查(同样一开始会觉得很烦人,但以后你会感激它的),它能确保代码稳定的运行。(我从其他公司小伙伴那听闻Google对代码要求让人汗颜) 3. 使用内部定制化的Eclipse IDE(真正的勇士在用VIM) 4. 自定义一切(构建系统、测试系统、java、版本控制、问题追踪系统、OS、等等),很多外面的东西放在Google的规模基本不能用 5. Google Collection(你不需要“new ArrayList()”,取而代之的是“Lists.newArrayList()”或者类似的操作) 6. 巨大的Java文件(我曾经见过一个.java文件超过9万行),通常这是自动生成的代码 7. 忘记标准的序列化相关的东西,欢迎使用protocol buffers,以Google的量级来说这很重要 8. 有各种机会来提升你的技能(技术讲座、代码实验室、专题讨论等等) 9. 大量的会议 10. 可升降的桌子 11. 两个大的显示器 12. 每周五的免费啤酒 13. 附近的小厨房能填充肚子 14. Slides 和 firepoles (就是那个弯弯的东东)能直达自助餐厅,因此你可以吃的更胖 15.

Netty网络编程实战

流过昼夜 提交于 2020-08-09 14:51:52
前言 一个完整的Http请求包括客户端(常常为浏览器)请求和服务器响应两大部分,那么你清楚在这个过程中底层都做了哪些事情吗?又如HTTP请求的短连接和长连接底层的区别是什么?再如何基于Netty定制开发符合特定业务场景的HTTP监听器 ... 等等这些问题都是今天我们要解决的问题。 HTTP请求 一次完整的HTTP请求需要经历以下过程: 其中在HTTP1.1及以上版本,开启keep-alive, 步骤1和步骤7只做一次。 步骤2和步骤3中请求的报文结构如下: 步骤4~步骤6的响应报文结构如下: HTTP短连接和长连接 短链接执行流程 HTTP 是无状态的,浏览器和服务器每进行一次 HTTP 操作,就建立一次连接, 但任务结束就中断连接。 长连接执行流程 注: 使用http1.0开启keep-alived或http1.1 时,虽保持了TCP的长连接(默认300s), http请求的信息和状态是不会保存的,客户端仍然需使用额外的手段缓存这些信息如:Session,Cookie等;未改变http请求单向和无状态的特性; 可能的使用场景 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个 TCP 连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话 那么处理速度会降低很多,所以每个操作完后都不断开,处理时直接发送数据包 就 OK 了,不用建立 TCP 连接。

Netty系列-netty的初体验

吃可爱长大的小学妹 提交于 2020-08-09 12:54:07
一、前言 最近看了netty源码,打算写个博客记下来,方便后面再复习,同时希望也能方便看到的人,在研究netty的时候,多少能方便点。 二、环境搭建 git clone netty的代码下来,或者可以fork到自己的git 仓库,然后git clone下来。 后面的版本统一用 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.6.Final</version> </dependency> 三、例子研究 如下是服务端标准的代码案例,bossgroup主要是用来接收连接请求的,workergroup主要是用来处理读写请求的 1 EventLoopGroup bossGroup = new NioEventLoopGroup(1 ); 2 EventLoopGroup workerGroup = new NioEventLoopGroup(); 3 final EchoServerHandler serverHandler = new EchoServerHandler(); 4 try { 5 ServerBootstrap b = new ServerBootstrap(); 6 b.group(bossGroup, workerGroup) 7

Netty学习笔记(番外篇)

帅比萌擦擦* 提交于 2020-08-09 12:31:36
这一篇是 ChannelHandler 和 ChannelPipeline 的番外篇,主要从源码的角度来学习 ChannelHandler、ChannelHandler 和 ChannelPipeline 相互之间是如何建立联系和运行的。 一、添加 ChannelHandler 从 上一篇 的 demo 中可以看到在初始化 Server 和 Client 的时候,都会通过 ChannelPipeline 的 addLast 方法将 ChannelHandler 添加进去 // Server.java // 部分代码片段 ServerBootstrap serverBootstrap = new ServerBootstrap(); NioEventLoopGroup group = new NioEventLoopGroup(); serverBootstrap.group(group) .channel(NioServerSocketChannel.class)Channel .localAddress(new InetSocketAddress("localhost", 9999)) .childHandler(new ChannelInitializer<SocketChannel>() { protected void initChannel(SocketChannel

拿了华为公司offer,但是是外包的?我要不要签?

余生颓废 提交于 2020-08-09 12:29:50
参加过校招的同学,应该对外包有一定的了解了。基本上我们听过的企业都有外包岗,很多同学也在校招的过程中拿到过外包offer。 现在很多大型公司为了节省成本,将一些偏重劳动量,而非技术量的工作,都选择外包给第三方公司来做,这就导致了现在外包公司发展越来越兴。如果接到外包公司的offer,你会怎么选择呢? 1 外包offer你会接吗? @Abin:拒绝了阿里外包的offer,剩下的唯有静心准备5月的到来。不后悔就好惹 ~ @Keiko:收到邮储银行的offer,好纠结要不要去,为什么又是外包的呢,好怕又被坑了,我已经被坑过一次了。 @太难了:我收到了公司的offer,是外包公司,叔叔说外包公司很累,不太适合女生。我周围的同学朋友都是这么告诉我的,我不禁想真的是这样吗,我要不要去试试,即使不好,我也需要去碰碰壁,知道社会不容易,才能做更好的决定。 @木兮木有:终于拿到offer了,虽然是一家外包公司,还是很开心。 @荟芸:接了华为Offer,不过是外包的,给的薪资比较满意,担心外包的去了会不会没人权[委屈]好纠结要不要去? @木木林:今天听外包小哥讲业务,说当初有好几个offer现在这家是最低的,hr说妹子多就过来了,结果发现被骗了。 @爱生活爱工作:面临抉择,外包公司到底去不去[费解],但是另外一份offer又怕赶不上了,头疼 ! 2 在外包公司工作是什么样的体验? @让自己满意

「从零单排canal 04」 启动模块deployer源码解析

岁酱吖の 提交于 2020-08-09 05:14:53
基于1.1.5-alpha版本,具体源码笔记可以参考我的github: https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal 本文将对canal的启动模块deployer进行分析。 Deployer模块(绿色部分)在整个系统中的角色如下图所示,用来启动canal-server. 模块内的类如下: 为了能带着目的看源码,以几个问题开头,带着问题来一起探索deployer模块的源码。 CanalServer启动过程中配置如何加载? CanalServer启动过程中涉及哪些组件? 集群模式的canalServer,是如何实现instance的HA呢? 每个canalServer又是怎么获取admin上的配置变更呢? 1.入口类CanalLauncher 这个类是整个canal-server的入口类。负责配置加载和启动canal-server。 主流程如下: 加载canal.properties的配置内容 根据canal.admin.manager是否为空判断是否是admin控制,如果不是admin控制,就直接根据canal.properties的配置来了 如果是admin控制,使用PlainCanalConfigClient获取远程配置

Spring Boot 2.3 新特性优雅停机详解

北城以北 提交于 2020-08-09 02:23:08
什么是优雅停机 先来一段简单的代码,如下: @RestController public class DemoController { @GetMapping("/demo") public String demo() throws InterruptedException { // 模拟业务耗时处理流程 Thread.sleep(20 * 1000L); return "hello"; } } 当我们流量请求到此接口执行业务逻辑的时候,若服务端此时执行关机 (kill),spring boot 默认情况会直接关闭容器(tomcat 等),导致此业务逻辑执行失败。在一些业务场景下:会出现数据不一致的情况,事务逻辑不会回滚。 graceful shutdown 在最新的 spring boot 2.3 版本,内置此功能,不需要再自行扩展容器线程池来处理, 目前 spring boot 嵌入式支持的 web 服务器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及反应式和基于 Servlet 的 web 应用程序都支持优雅停机功能。 我们来看下如何使用: 当使用 server.shutdown=graceful 启用时,在 web 容器关闭时,web 服务器将不再接收新请求,并将等待活动请求完成的缓冲期。 配置体验 此处支持的 shutdown 行为