实战
上进唯实战可得,突破绝技成长瓶颈
手记
分享经验交流心得,学习前沿流行技术
-
国内酒店稳定性治理实践之缓存治理
背景2019 年 9 月,我们连续遇到几次与缓存相关的故障:1、DBA 运维失误,导致我们存储在 redis 里的核心基础数据被清空。由于无法正常提供报价,出现 ATP(订单量骤降)故障,之后通过定时任务花费半个小时将数据写回 redis,故障恢复。2、PC 端爬虫流量进入后端,应用的 redis 连接池被打满,大量同步的 redis 请求都等待 500ms 获取连接,导致应用的 tomcat 线程池被打满,服务被拖死,无法正常提供 PC 端业务,而 redis server 端当时还完全没压力。类似与缓存相关的故障还有不少,这里就不一一列举了。在对故障进行 review 时,我们意识到有不少核心场景都使用了 redis 缓存作为核心依赖和存储,同时这些场景我们并没有对 redis 可能出现的问题进行预防和处理。由于我们的核心业务重度依赖 redis,为了不让类似的故障重复上演,也希望在故障前做好准备和预防,我们对缓存进行了专项的治理。治理方案1、高可用治理:这项是最重要的,但是和 redis 本身的高可用
1799浏览
1推荐
0评论
-
也谈拼多多被薅羊毛事件
周日的拼多多事件经过一个周日和一个周一的发酵,想必大部分人都已经知道了,有些人在感慨为什么自己每次都是在别人薅羊毛结束才知道没能参与,有些人在趁机推自家广告,有些人在做事件复盘总结...当然,我也难免落入俗套,也做个技术方面的总结,别人做过的总结我尽量避免重复,重点从开发人员角度说一下类似于拼多多这种量级的系统日常开发和运维要注意的一些问题。一、监控个人认为监控是这次事件里最值得关注的地方。一个成熟的系统,除了功能完善之外,监控是必不可少的。这里说的监控主要包括两方面,一是业务方面,一是接口级别。1)业务方面的监控。当一个系统流量大到一定程度时,就可以额外出现很多数据,一定时间(一分钟或几分钟)内单量总量、一定时间内支付总额、一定时间内支付次数、相比上一小时的涨跌幅、相比昨日相同时间段的涨跌幅、相比一周前相同时间段的涨跌幅等等,明显的涨跌都可能有问题的。我们系统目前每天千万单,高峰期每分钟几万单,刚才介绍的这类监控都有了,任何涨跌幅超出预期都会报警2)接口级别的监控。接口级别主要包含请求QPS、响应时间(t
6263浏览
10推荐
8评论
-
高并发场景下转移表的处理过程探讨
前提 技术调整,现在需要将表A从数据库B转移到数据库C里,成为新表D。 这篇文章主要是分享一下我们的方案 详细方案 调研(通过监控等,多个系统有使用)整理出所有涉及表A的SQL 新库上创建新表 在原有相关方法上添加开关,允许: 1)更新操作-同时更新(包括写)表A和表D 2)更新操作-只更新(包括写)表A 3)更新操作-只更新(包括写)表D 4)查询操作-单独查表A 5)查询操作-单独查表D 6)查询操作-同时查表A和表D记录不一致情况 这里需要注意,同一个方法可能要使用多个开关,多
6443浏览
10推荐
1评论
-
多线程并发的使用、学习与测试
前提 之前写过一篇手记 面试中并发类问题的准备和学习 ,得到许多学员不错的反馈。但依然有这样的问题,许多人已经知道并发有这些内容,也知道这些知识点该如何用,但是却不知道该如何在实际项目中使用。基于以上,这篇手记将在之前手记的基础上,继续介绍多线程并发的使用、学习与测试。 也希望这篇手记能帮助 Java并发编程与高并发解决方案 的学员更好的学习课程。 使用 先说说多线程的使用。多线程本身是与我们开发的项目密不可分的,我们只要提供了接口,那么他就可能被多个线程同时
13645浏览
32推荐
3评论
-
JVM命令之jstat深入讲解
JVM命令使用演示 这篇文章里演示了一些jvm命令的使用,跟着这个主题,写了:JVM命令之jstack深入讲解 和 JVM命令之jmap深入讲解 ,今天接着这条线具体介绍一下jstat命令的使用。作用JVM statistics Monitoring,用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。使用依旧先看一下使用帮助~ ᐅ jstat -helpUsage: jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]Definitions: <option> An option reported by the -
11375浏览
8推荐
0评论
-
JVM命令之jmap深入讲解
在 JVM命令使用演示 这篇文章里演示了一些jvm命令的使用,之后深入讲解了jstack命令,具体参考:JVM命令之jstack深入讲解,接着这条主线,这篇文章继续深入讲解一下jmap命令。作用JVM Memory Map,用于生成heap dump文件,可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件。jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。使用先看看看帮助~ ᐅ jmap -helpUsage: jmap [option] <pid> (to connect to running process) jmap [option] <executable <core>&nbs
9641浏览
4推荐
1评论
-
JVM命令之jstack深入讲解
在JVM命令使用演示这篇文章里演示了一些jvm命令的使用,这篇文章重点对jstack做一些深入的讲解。作用jstack主要用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。如果现在运行的java程序呈现hung的状态,jstack是非常有用的。使用先看看看帮助~ ᐅ jstack -helpUsage: jstack [-l] <pid> (to connect to running process) jstack -F [-m] [-l] <pid> &
13127浏览
12推荐
0评论
-
JVM命令使用演示
之前推送了一本jvm相关的书籍 【JVM Troubleshooting Guide】书籍推荐及下载,个别小伙伴反馈说关于jvm看了不少资料,有些印象,但是不知道如何使用那些命令。就着这个前提,简单演示一下jvm一些命令的使用。(温馨提示,由于jvm命令返回的字符串偏长一些,手机上效果差一些,建议在电脑上看)首先,先准备一段代码,直接运行一个java程序也可以,比如:@Slf4j public class SearchBusiestCPU { public static void main(String[] args) { for (int i = 0; i < 10; i++)
6432浏览
15推荐
2评论
-
Linux性能分析工具
【性能分析工具】首先来看一张图:上图是Brendan Gregg 的一次性能分析的分享,这里面的所有工具都可以通过man来获得它的帮助文档,下问简单介绍介绍一下常规的用法: vmstat--虚拟内存统计vmstat(VirtualMeomoryStatistics,虚拟内存统计) 是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。vmstat的常规用法:vmstat interval times即每隔interval秒采样一次,共采样times次,如果省略times,则一直采集数据,直到用户手动停止为止。简单举个例子:可以使用ctrl+c停止vmstat采集数据。第一行显示了系统自启动以来的平均值,第二行开始显示现在正在发生的情况,接下来的行会显示每5秒间隔发生了什么,每一列的含义在头部,如下所示: procs:r这一列显示了多少进程在等待cpu,b列显示多少进程正在不可中断的休眠(等待IO)。 memory:swapd列显示了多少块被换出了磁盘
11103浏览
19推荐
2评论
-
《Java并发编程与高并发解决方案》课程相关手记汇总 - 持续更新
给《Java并发编程与高并发解决方案》课程准备的手记列表,为了方便大家阅读,单独整理成一篇汇总,学习时结合手记效果会更好哦~ 更多手记可点击我的个人首页:http://www.imooc.com/t/5980627 并发课程知识点索引手记:http://www.imooc.com/article/24007 并发课程问题汇总:http://www.imooc.com/article/25035 面试中并发类问题的准备和学习:http://www.imooc.com/article/23969 多线程并发的使用、学习与测试:https://www.imooc.com/article/69148 Fork/Join框架使用及注意点:http:
45536浏览
55推荐
2评论
-
利用mybatis插件实现数据库分表
前言 前面介绍了数据库【分库】相关技术的实现,包括:自定义注解完成数据库切库 和 多个数据源的轻松支持,再来看 面试中并发类问题的准备和学习 这边手记,高并发处理思路与手段里数据库部分还差一个【分表】,这篇手记主要就来说一下通过mybatis的插件【shardbatis2.0】来完成分表的实现。 Java并发编程与高并发解决方案这门课程的学员需要特别注意,课程里高并发部分提到的【数据库分表】,可以参考着这篇手记来学习~ 准备 首先代码里已经完整的支持了mybatis的使用,至于如何在项目
28907浏览
30推荐
7评论
-
《Java并发编程与高并发解决方案》问题汇总 - 持续更新中
注:这篇手记是为《Java并发编程与高并发解决方案》课程的学员特意准备的。 开篇 首先感谢大家对这门课程的支持。根据大家平时在群里讨论的和问题区提问的内容,我专门做了这篇手记来对【问题】和【解答】做一下整理,并持续更新。希望大家保持这种爱提问多讨论的方式,也希望这篇问题汇总手记能在实际中帮助到大家。 学习完课程,如果感觉课程不错的话,别忘了给课程个好评,谢谢啦~ 其他汇总手记 《Java开发企业级权限管理系统》问题汇总 《Java并发编程与高并发解决方案》知识点索引
30232浏览
24推荐
6评论
-
JDK8函数式编程之Stream API
发现许多学员对当前流行的JDK8的stream还是很陌生,特别找了一篇文章。以下是正文:你可能没意识到Java对函数式编程的重视程度,看看Java 8加入函数式编程扩充多少功能就清楚了。Java 8之所以费这么大功夫引入函数式编程,原因有二:代码简洁,函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。多核友好,Java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下parallel()方法。这一节我们学习stream,也就是Java函数式编程的主角。对于Java 7来说stream完全是个陌生东西,stream并不是某种数据结构,它只是数据源的一种视图。这里的数据源可以是一个数组,Java容器或I/O channel等。正因如此要得到一个stream通常不会手动创建,而是调用对应的工具方法,比如:调用Collection.stream()或者Collection.parallelStream()方法;调用Arrays.stream(T[] array)方法。常见
14188浏览
42推荐
2评论
-
并发之Fork/Join框架使用及注意点
针对《Java并发编程与高并发解决方案》课程学员在问答区提问的内容,单独整理一篇手记,便于大家理解。 Fork/Join框架介绍 Fork/Join框架是Java7提供的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。使用工作窃取(work-stealing)算法,主要用于实现“分而治之”。 工作窃取算法介绍 工作窃取(work-stealing)算法优点是充分利用线程进行并行计算,并减少了线程间的竞争,其缺点是在某些情况下还是存在竞争,比如双端
16792浏览
19推荐
0评论
-
《Java并发编程与高并发解决方案》知识点索引
《Java并发编程与高并发解决方案》课程已上线,首先感谢大家的支持和信任,为了方便大家学习,特别制作了知识点索引脑图,让大家对课程相关的知识点有整体的认识,更容易建立起知识体系,也方便大家复习和总结。大家学习时,也记得参考我为并发学习准备的手记:面试中并发类问题的准备和学习 课程上线后,发现个别地方有点小问题,具体说一下:在2-4等章节讲解时,误将“线程”说成了“进程”。这门课程核心讲解的是多线程并发,课程里相关概念说的也都是“线程”,而不是“进程”,需要大家在
39462浏览
41推荐
7评论
-
面试中并发类问题的准备和学习
声明:本文主要讨论的是后端Java开发职位的面试 主题 又到面试季了,从课程的群里,看到许多同学分享了自己的面试题目,我也抽空在网上搜索了一些许多公司使用的面试题,目前校招和社招的面试题基本都集中在几个大方向上,主要是:Java基础、并发、JVM、算法、数据库、一些框架、分布式集群 等。这里呢,单独就面试中的【并发】问题的准备和学习发表一下个人的见解。 现状 关于对并发的学习和理解,通过和许多学员沟通及大家在课程群里的反馈,总结一下,主要包含以下几种: 完全不知道并
47686浏览
142推荐
16评论
-
多个数据源的轻松支持
前面文章里介绍了 自定义注解完成数据库切库 ,今天接着这个高并发的话题,继续说一下项目里多个数据源的支持。 如何理解支持多个数据源呢?简单的说,就是一个项目里,同时可以访问多个不同的数据库。 实现的原理先交待一下:单个数据源在配置时会绑定一套mybatis配置,多个数据源时,不同的数据源绑定不同的mybatis配置就可以了,简单的思路就是让不同的数据源扫描不同的包,让不同的包下的mapper对应连接不同的数据源去处理逻辑。 场景假设:项目底层有正常业务库和日志库,希望解决的是
11665浏览
17推荐
1评论
-
自定义注解完成数据库切库
前提 这几天,学员们反馈希望学习一下自定义注解,正好准备高并发课程内容里有一块涉及到使用自定义注解完成数据库切库的内容。这里单独写一篇文章记录说明一下。 为什么会有数据库切库一说 首先,许多项目都有主库与从库,有的主库后面甚至会有很多个从库,主从库之间的通常同步也很快,这为数据库切库提供了一个基础,因为可以去不同的数据库查询,得到相同的结果(如果不同的数据库是完全不同的,这个不在我们这篇文章讨论的范围之内,那个属于让项目支持多个数据源) 其次,随着项目越来
15786浏览
46推荐
7评论
-
《Java开发企业级权限管理系统》git 代码获取说明
注意 码云调整为每个私仓成员上限5人,因此已经没法开通码云上代码权限了。代码目前只能从慕课网网站上下载,后续如果有调整,会对文章做更新 阅读前说明 该篇手记主要为《Java开发企业级权限管理系统》的学员辅助学习使用 前提 之前有人建议使用git来管理代码,这个建议非常不错。因此我在 https://gitee.com/jiminzheng (码云)上为权限课程相关的代码创建好了项目。 其中spring security 和 apache shiro 的演示代码是公开的,地址为: https://gitee.com/jiminzheng/springse
10072浏览
13推荐
0评论
-
《Java开发企业级权限管理系统》问题汇总 - 持续更新中
《Java开发企业级权限管理系统》 这门课程上线有一段时间了,知识点索引请参考:《Java开发企业级权限管理系统》知识点索引。这篇手记总结一下常见的问题,方便大家学习,并且会持续更新。 这里补充一个建议,学习课程时有问题的地方,优先来这里和问答区看一下是否已经有答案了,没有的话可以在QQ群里咨询一下,如果没有人第一时间给予帮助解决,推荐在问答区提问出来,这样可以保证我肯定能看到并能及时进行解答,每天的问题基本都可以当天得到解答,其他学员也可以学习到。 问答区 关于lo
12663浏览
29推荐
8评论
-
Mybatis Generator 配置详解
许多人在Java项目中都会到使用Mybatis Generator这个工具包,这里把这个工具的配置完整列一下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <!-- 配置生成器 --> <generatorConfiguration> <!-- 可以用于加载配置项或者配置文件,在整个配置文件中就可以使用${propertyKey}的方式来引用配置项 resource
8750浏览
28推荐
2评论
-
《Java开发企业级权限管理系统》知识点索引
《Java开发企业级权限管理系统》这门实战课已经上线一段时间了,为了方便大家对企业级项目中的权限有更深入的了解,我特意写了一些权限相关的手记,许多同学都反应帮助很大,这里具体列一下: 1、改造电商交易后台权限管理过程 2、数据权限通用设计方案 3、自定义JSP标签自动完成对页面按钮做权限拦截处理 4、数据库设计技巧:一个字符串细节处理解决递归查询问题 同时,平时QQ群里大家经常会有项目外的一些疑问,简单的我都在群里直接做了回答。不能简单概括的,我也为此专门通过手记做了
22943浏览
52推荐
3评论
-
数据权限通用设计方案
问题引出 最近,许多学员反馈项目中需要处理数据权限,但是不知道怎么处理比较合适。这篇手记将针对这个问题,给出一种比较通用且容易扩展的数据权限设计方案。 现状 目前流行的权限框架已经有支持数据权限的了,但是需要配置在接口和方法上,扩展性不是很好,那么怎样做能让扩展性最大化呢? 很容易想到的就是:将数据权限的控制放到数据库里存储,在权限拦截时先判断接口是否有权访问,在接口有权访问后,接下来根据配置的条件判断是否有权使用指定的参数值。(做的更高级些,可以对返回的
28994浏览
36推荐
6评论
-
Java项目中使用log记录日志的一些总结
本文介绍了一下自己在Java项目中使用log的一些总结,从日志的作用、日志的选用、日志级别介绍、日志记录的一些最佳实践几个方面阐述。 日志的作用 主要作用包括: 1、出问题后定位当时问题 2、显示程序当前运行状态 日志的选用 Java里存在众多的开源日志框架: slf4j, logback, log4j, JCL(Apache Common Logging), JUL(JDK自带的java.util.logging)等。这其中slf4j属于一套简洁的日志API,其并不包含日志的实现(它并不负责日志输出等,JCL也包含API)。 slf4j提供了众多的适配器可
16993浏览
68推荐
3评论
-
数据库设计技巧:一个字符串细节处理解决递归查询问题
问题提出 许多人在做开发时都会遇到这样的case,比如:需要维护一个部门层级结构,每个部门都要存储一个上级部门的id,记做parent_id, 当查询一个部门的所有子部门时,需要根据parent_id递归的查询到底层,层级深的部门需要查询次数特别多,那么问题来了,是否可以通过一个简单的设计满足一次查询某个部门的所有子部门呢? 技巧来了 答案是:有的 对于上图的部门层级结构,给出对应的数据库设计 具体说一下:添加一个辅助的varchar字段level,字段的逻辑是多个部门的id使用.来连接,假设首
9732浏览
57推荐
13评论
-
Redis在股票分时K线图计算的实践
来公司第一个比较大的业务需求,便是换了新的行情提供商,需要把所有K线的处理都重新倒腾一遍。这里说说重写分时K线图的一点心得。 先交代一下数据提供商的情况: 1)股票分时数据采用订阅的方式,可以订阅历史数据 2)每分钟每只股票可能会接收到多条分时数据,也可能一条不推。有些股票在开市过程中每分钟都会有分时数据,有些股票则一个交易日只有几条数据,甚至没有,差别很大 3)推送的分时数据有延迟,从监控获得数据,开市期间大约在60s-120s左右(分时数据看的是趋势,这是可以忍受
17966浏览
69推荐
7评论
-
简谈从零开始搭建一套业务相关监控报警系统
声明 手记内容主要为自己在公司从零搭建完整的基于业务的监控报警系统的过程,这个过程中许多决策都不是唯一选择,且主要是基于Java项目来做的。 正文 监控对企业级项目特别重要,许多企业都已经拥有了自己的监控报警系统,监控报警系统的重要性就不在这里列举了。那么,从零开始搭建一套完整的业务报警系统要做哪些事情呢? 客户端 首先,需要能生成监控。这时候需要写一个客户端,客户端提供方法给业务端调用来生成监控。客户端都要完成哪些内容呢? 通常监控是每分钟生成一个监控点,客
12433浏览
30推荐
6评论
-
自定义JSP标签自动完成对页面按钮做权限拦截处理
前提 许多后台系统的页面是使用JSP页面来编写的,在后台系统权限管理逐渐完善的过程中,就会引申出这个需求来:系统已经支持了指定请求的权限控制,能否在页面加载时就对无权限处理的按钮或链接进行隐藏,每次点击后提示无权限操作,这种体验实在是不好。 方案 答案是肯定可以支持的,而且实现起来也很容易。自定义一套jsp页面的标签,校验当前用户是否有某个权限点的访问权限作为标签的后台处理逻辑就可以了。 Show me the code 接下来给出代码实现及核心注释,个别方法需要自己实现,
8717浏览
29推荐
3评论
-
改造电商交易后台权限管理过程
在Qunar做项目时,曾经接手一个特别大的需求:改造我们交易后台系统的权限管理。 背景 当时那个后台系统的权限管理真的是一团乱麻,具体包括: 系统里默认指定了几种角色,每个用户属性上只能配置一个角色属性,代码里每个角色能做什么事情是写死的(很多系统前期都会这么干) 曾经做过许多活动,几乎每个活动的管理员是单独写死的,并散落各处(硬编码我们都会) 使用这个后台的除了Qunar自己的管理员,还有供应商的管理员。最开始供应商管理员的权限是相同的,后期供应商管理员也要支持自
25824浏览
128推荐
14评论