为了账号安全,请及时绑定邮箱和手机立即绑定

美团二面:详细说说Kafka拉消息的过程? 原创

AbstractFetcherThread:拉取消息的步骤 副本机制是Kafka实现数据高可靠性的基础:同一个分区下的多个副本分散在不同的Broker机器上,它们保存相同的消息数据以实现高可靠性。那如何确保所有副本上的数据一致性呢?最常见方案当属Leader/Follower备份机制(Leader/Follower Replication)。Kafka分区的: 某个副本会被指定为Leader,负责响应客户端的读、写请求 其他副本自动成为Follower,被动同步Leader副本中的数据 被动同步:Follower副本不断向Leader副本发送读取请求,以获取Leader处

4962浏览
6推荐
0评论

阿里四面:Spring Exception的原理你精通了吗? 原创

错误场景 验证请求的Token合法性的Filter。Token校验失败时,直接抛自定义异常,移交给Spring处理: 测试HTTP请求: 日志输出如下:说明IllegalRequestExceptionHandler未生效。 why? 这就需要精通Spring异常处理流程了。 解析 当所有Filter被执行完毕,Spring才会处理Servlet相关,而DispatcherServlet才是整个Servlet处理核心,它是前端控制器设计模式,提供 Spring Web MVC 的集中访问点并负责职责的分派。 在这,Spring处理了请求和处理器的对应关系及统一异常处理。 Filter内

5329浏览
7推荐
0评论

面向对象编程 V.S 函数式编程 原创

面对不断增加的需求 假设有一组学生: 若按姓名找出其中一个,你的代码可能如下: 突然紧急需求来了,按学号找人,代码如下: 又一个新需求来了,这次按照ID 找人,代码可以如法炮制: 你发现,它们除查询条件不同,其余基本一模一样,别忘了代码结构重复也是代码重复! 如何消除重复呢? 引入查询条件,这里只需要返回一个bool值,可这样定义: 通过查询条件,改造查询方法,把条件作为参数传入: 于是,按名字查找变成: 已经很好了,但你发现,每有一个新查询,都要做一层封装。

404浏览
0推荐
0评论

编程的不变性到底是什么? 原创

有一类Bug是很让人头疼的,就是你的代码怎么看都没问题,可是运行起来就是出问题了。 某程序库是其他人封装的,我只是拿来用。按理我调用这个函数逻辑也不复杂,不应该有问题。 为快定位问题,还是打开了这个程序库源码。发现底层实现中,出现全局变量。 在我的代码执行过程中,有别的程序会调用另外函数,修改这个全局变量,导致程序执行失败。 表面看,我调用的这个函数和另外那个函数没关系,但它们却通过一个底层全局变量,相互影响。 有人认为这是全局变量使用不当,所以在Java设计中

656浏览
0推荐
0评论

为什么加了@WebFilter注解,Spring却没有给我自动注入该过滤器? 原创

在 Spring 编程中,主要配合如下注解构建过滤器: @ServletComponentScan @WebFilter 那这看起来只是用上这俩注解就能继续摸鱼了呀。但上了生产后,还是能遇到花式问题: 工作不起来 顺序不对 执行多次等 大多因为想当然觉得使用简单,没有上心。还是有必要精通过滤器执行的流程和原理。 @WebFilter 过滤器无法被自动注入 为统计接口耗时,实现一个过滤器: 该过滤器标记了 @WebFilter。所以启动程序加上扫描注解 @ServletComponentScan 让其生效: 然后,提供一个 UserContro

521浏览
0推荐
0评论

可变的数据有多可怕,你了解吗? 原创

程序=数据结构+算法,所以,数据几乎是软件开发最核心的一个组成部分。在一些人的认知中,所谓做软件,就是一系列的 CRUD 操作,也就是对数据进行增删改查。再具体一点,写代码就把各种数据拿来,然后改来改去。我们学习编程时,首先学会的,也是给变量赋值,类似 a = b + 1。 改数据,几乎已经成了很多程序员写代码的标准做法。然而,这种做法也带来了很多的问题。 满天飞的 Setter public void approve(final long bookId) { ... book.setReviewStatus(ReviewStatus.APPROVE

2374浏览
0推荐
0评论

由于不知道Java线程池的bug,某程序员叕被祭天 原创

说说你对线程池的理解? 首先明确,池化的意义在于缓存,创建性能开销较大的对象,比如线程池、连接池、内存池。预先在池里创建一些对象,使用时直接取,用完就归还复用,使用策略调整池中缓存对象的数量。 Java创建对象,仅是在JVM堆分块内存,但创建一个线程,却需调用os内核API,然后os要为线程分配一系列资源,成本很高,所以线程是一个重量级对象,应避免频繁创建或销毁。 既然这么麻烦,就要避免呀,所以要使用线程池! 一般池化资源,当你需要资源时,就调用申请线程方法申请资源,用

273浏览
0推荐
0评论

四面阿里被问MySQL底层如何实现order by的,瞬间懵了! 原创

这天风和日丽,小a正在工位上苦练钓鱼技术, 突然接到产品的☎️,又来需求? 只听到产品又开始口若黄河:我需要要查询到city是“上海”的所有人的name,并且还要按name排序返回前1000人的name、age。 小a急忙正襟危坐,从一堆库表中翻出需要的表,抽出其建表语句: 看看表结构,再看看产品的需求 感觉很容易,随手SQL这么一写: 诶,这语句看着简单而朴实,一个需求好像就完美解决了。但为了显示自己强大的性能优化水平,考虑到要避免全表扫描,于是又给 city 字段加索引。 建完索引,

2466浏览
3推荐
0评论

原来大厂都这么使用Redis持久化! 原创

全是干货的技术号: 本文已收录在github,欢迎 star/fork: github.com/Wasabi1234/Java-Interview-Tutorial Redis 对外提供数据访问服务时,使用的是常驻内存的数据。如果仅将数据存在内存,一旦宕机重启,数据全部丢失。 1 持久化概论 1.1 什么是持久化 redis所有数据保持在内存中,对数据的更新将异步地保存到磁盘上。持久化主要是做灾难恢复、数据恢复,可归类到高可用。 比如你的Redis宕机,你要做的事情是让Redis变得可用,尽快变得可用! 重启Redis,尽快让它对外提供服务,若

929浏览
0推荐
0评论

拥抱Kubernetes,再见了Spring Cloud 原创

相信很多开发者在熟悉微服务工作后,才发现: 以为用 Spring Cloud 已经成功打造了微服务架构帝国,殊不知引入了 k8s 后,却和 Cloud Native 的生态发展脱轨。 从 2013 年的 Spring Boot 2012年10月,Mike Youngstrom在Spring jira中创建了一个功能需求,要求在Spring框架中支持无容器Web应用程序体系结构。他建议通过main方法引导的Spring容器内配置Web容器服务。这一需求促成了2013年初开始的Spring Boot项目的开发。2014年4月,Spring Boot 1.0.0发布。从那以后,一些Spr

1697浏览
0推荐
1评论

手把手教你调试Netty创建连接流程源码 原创

执行过程 boss thread NioEventLoop 中的 selector轮询创建连接事件 (ОР_АССЕРT) 创建 socket channel 初始化 socket channel 并从 worker group 中选择一个 NioEventLoop worker thread 将socket channel注册到选择的NioEventLoop的selector 注册读事件(OP_ READ)到selector 上 接收连接请求的处理本质是对 OP_ACCEPT 的处理,即在 NioEventLoop 中,因为注册到了NioEventLoop的 selector。 分别调试启动 EchoServer 和...

1314浏览
0推荐
0评论

Netty-源码阅读入门实战(三)-启动服务流程源码 原创

我们自己的线程,如果写在main 方法,那就是 main 线程 在创建 NioEventLoopGroup(创建一组NioEventLoop) 的过程中就创建了 selector 这里因为我们当前线程其实是 main 线程,所以为 false 创建 ServerSocketChannel 初始化 server socket channel 给 server socket channel 从 boss group 选择一个 NioEventLoop boss thread 将 serverSocketChannel 注册到选择的 NioEventLoop 的 selector 绑定地址启动 注册接受连接事件(OP_ACCEPT)...

734浏览
0推荐
0评论

面试阿里被P8质问:ConcurrentHashMap真的线程安全吗?

没啥深入实践的理论系同学,在使用并发工具时,总是认为把HashMap改为ConcurrentHashMap,就完美解决并发了呀。或者使用写时复制的CopyOnWriteArrayList,性能更佳呀!技术言论虽然自由,但面对魔鬼面试官时,我们更在乎的是这些真的正确吗? 1 线程重用导致用户信息错乱 生产环境中,有时获取到的用户信息是别人的。查看代码后,发现是使用了ThreadLocal缓存获取到的用户信息。 ThreadLocal适用于变量在线程间隔离,而在方法或类间共享的场景。 若用户信息的获取比较昂贵(比如从DB查询)

1126浏览
0推荐
1评论

架构师教你kill祖传石山代码重复/大量ifelse

本文就教你如何优雅消除重复代码并改变你对业务代码没技术含量的观念。 1 crud 工程师的“痛” 很多 crud 工程师抱怨业务开发没有技术含量,什么设计模式、高并发、OOP都用不到,就是堆CRUD。每次面试被问到“讲讲常用设计模式?”,都只能把单例讲到精通,其他设计模式即使听过也只会简单说说,因为根本没实际用过。 对于反射、注解,也只是知道在框架中用的很多,但自己又不写框架,更不知道该如何使用。 设计模式、OOP是世界级软件大师在大型项目的经验所得,是被证实利于维护大型项

855浏览
0推荐
0评论

阿里Java架构师教你编码规范-如何校验参数? 原创

1 参数校验的意义 大多数方法对传递给它们的参数值有限制。例如,索引值必须非负,对象引用必须非空。 应该清楚地在文档中记录所有这些限制,并在方法主体的开头使用检查来实施它们。 应该在错误发生后尽快找到它们,这是一般原则。如果不这样做,就不太可能检测到错误,而且即使检测到错误,确定错误的来源也很难。 若一个无效参数被传递给一个方法 若该方法在执行前检查参数,这过程将迅速失败,并引发异常 若方法未检查参数,可能会在处理过程中出现: 莫名其妙的异常而失败 正常返

1478浏览
1推荐
0评论

高可扩展性系统的设计 原创

> 文章收录在我的 GitHub 仓库,欢迎Star/fork: > Java-Interview-Tutorial > https://github.com/Wasabi1234/Java-Interview-Tutorial 架构设计的高可扩展性表示可通过加机器线性提高系统处理能力,承担更高流量和并发。 由于峰值的流量不可控,不可能在系统架构设计初期就考虑好机器数量以支持并发。 一般基于成本考虑,在业务平稳期,会预留30%~50%冗余机器应对运营活动或者推广可能带来的峰值流量,但当有突发事件时,流量可能瞬间提升几倍。莫过于明星公布恋情,大家都会到两人

604浏览
0推荐
0评论

软件架构分层方法论 原创

> 文章收录在我的 GitHub 仓库,欢迎Star/fork: > Java-Interview-Tutorial > https://github.com/Wasabi1234/Java-Interview-Tutorial 一般初创软件,为快速上线,几乎不考虑分层。但随业务越发复杂,就会导致逻辑复杂、模块相互依赖、代码扩展性差等各种问题。 架构分层迫在眉睫。 1 什么是架构分层? 软件工程中常见的设计方式,将整体系统拆分成N个层次,每个层次有独立的职责,多个层次协同提供完整的功能。 初学 JavaWeb 时一般要求设计成 MVC 架构。另外一种常见的分层

848浏览
1推荐
0评论

Kafka消费过程关键源码解析 原创

本文已收录在github,欢迎 star/fork: https://github.com/Wasabi1234/Java-Interview-Tutorial 1 案例引入 官方Consumer最简代码用例: 简短的代码,背后牵涉很多问题,Consumer如何绑定特定分区?如何实现订阅 topic 的?又如何实现拉消息? 2 订阅流程 订阅主流程主要更新如下关键属性: 订阅状态(SubscriptionState) - subscriptions 主要维护所订阅的topic和patition的消费位置等状态信息 元数据中的topic信息 metadata中维护了Kafka集群元数据的一个子集,包括集群的B

1030浏览
0推荐
0评论

一文看透Redis过期策略&内存淘汰策略 原创

本文已收录在github,欢迎 star/fork: https://github.com/Wasabi1234/Java-Interview-Tutorial 1 设置带过期时间的 key expire key seconds 时间复杂度:O(1) 设置key的过期时间。超时后,将会自动删除该key。在Redis的术语中一个key的相关超时是volatile的。 超时后只有对key执行DEL、SET、GETSET时才会清除。 这意味着,从概念上讲所有改变key而不用新值替换的所有操作都将保持超时不变。 例如,使用 INCR 递增key的值,执行 LPUSH 将新值推到 list 中或用 HSET 改变

591浏览
0推荐
0评论

这可能是你见过最好的Redis主从复制原理 原创

本文已收录在github,欢迎 star/fork: https://github.com/Wasabi1234/Java-Interview-Tutorial 在Redis复制的基础上(不包括Redis Cluster或Redis Sentinel作为附加层提供的高可用功能),使用和配置主从复制非常简单,能使得从 Redis 服务器(下文称 slave)能精确得复制主 Redis 服务器(下文称 master)的内容。每次当 slave 和 master 之间的连接断开时, slave 会自动重连到 master 上,并且无论这期间 master 发生了什么, slave 都将尝试让自身成为 master 的

1193浏览
1推荐
0评论
首页上一页1234567下一页尾页
意见反馈 帮助中心 APP下载
官方微信