Java日知录

一个坚持原创,有态度的博客!

0%

大家好,我是飘渺。

分布式数据库架构下,索引的设计也需要做调整,否则无法充分发挥分布式架构线性可扩展的优势。今天我们就来聊聊 “在分布式数据库架构下,如何正确的设计索引?”。

主键选择

对主键来说,要保证在所有分片中都唯一,它本质上就是一个全局唯一的索引。如果用大部分同学喜欢的自增作为主键,就会发现存在很大的问题。

因为自增并不能在插入前就获得值,而是要通过填 NULL 值,然后再通过函数 last_insert_id()获得自增的值。所以,如果在每个分片上通过自增去实现主键,可能会出现同样的自增值存在于不同的分片上。

比如,对于电商的订单表 orders,其表结构如下(分片键是o_custkey,表的主键是o_orderkey):

阅读全文 »

大家好,我是飘渺。

我负责的系统到2021年初完成了功能上的建设,开始进入到推广阶段。随着推广的逐步深入,收到了很多好评的同时也收到了很多对性能的吐槽。刚刚收到吐槽的时候,我们的心情是这样的:

image-20220615222123524

当越来越多对性能的吐槽反馈到我们这里的时候,我们意识到,接口性能的问题的优先级必须提高了。然后我们就跟踪了1周的接口性能监控,这个时候我们的心情是这样的:

阅读全文 »

大家好,我是飘渺。听多了架构优化,数据库优化,今天我们来聊聊服务器优化。

我们开发的软件服务需要在服务器上运行,所以服务器性能代表了软件的性能上限,因此服务器性能调优是个十分重要的环节,然而大部分同学对服务器性能调优关注的较少,今天从3个部分对服务器性能调优进行介绍,分别是:服务器配置选择,服务器负载分析,服务器内核参数调优。

服务器配置选择

服务器一般是由CPU、内存、磁盘和网卡组成,因此选择服务器配置就是选择CPU核数、内存大小、磁盘大小及类型、网络带宽。但是,服务器配置的选择是很难标准化的,也就是说很难推断出“一台需要达到1000TPS的后端服务器”的配置应该是什么样的。因为软件的最终运行性能与软件的实现方式是紧密相关的,即使是同一个后端应用程序中的两个接口,由于具体功能的差别,性能也会有所差别。

阅读全文 »

大家好,我是飘渺。

粉丝群里一直有人在讨论DDD,看来大家对DDD还是比较感兴趣的。所以今天我们来实践一下。同时为了证明该文没有注水,列一下当时的学习资料:

  • 小米内部 DDD 系列分享;
  • 小米内部 DDD 脚手架;
  • 小米内部授权认证项目(应用 DDD);
  • 极客时间欧创新的《 DDD 实战课》;
  • 掘金“柏炎”的 DDD 系列文档和 DDD Demo;
  • 美团技术团队、阿里云开发社区、网上博客等。

不 BB,直接上思维导图!

阅读全文 »

大家好,我是飘渺。

有不少人私下问我,为什么SpringCloud alibaba实战系列不更新了,主要是因为大部分核心功能都已经讲完了,剩下的基本是属于业务功能开发了,需要根据实际业务扩展。

今天更新文章的原因是粉丝提了个问题:如何实现Oauth2认证服务器自定义登录接口以及返回自定义格式? 这里我给大家分享一个简单且实用的方法,既可以灵活定制登录参数也可以自行组装返回结果。

阅读全文 »

大家好,我是飘渺。今天我们来聊一聊 ZGC。

ZGC(Z Garbage Collector) 是一款性能比 G1 更加优秀的垃圾收集器。ZGC 第一次出现是在 JDK 11 中以实验性的特性引入,这也是 JDK 11 中最大的亮点。在 JDK 15 中 ZGC 不再是实验功能,可以正式投入生产使用了,使用 –XX:+UseZGC 可以启用 ZGC。

ZGC 有 3 个重要特性:

  • 暂停时间不会超过 10 ms。

JDK 16 发布后,GC 暂停时间已经缩小到 1 ms 以内,并且时间复杂度是 o(1),这也就是说 GC 停顿时间是一个固定值了,并不会受堆内存大小影响。

下面图片来自:https://malloc.se/blog/zgc-jdk16

阅读全文 »

大家好,我是飘渺。

SpringBoot 如何进行限流,老鸟们都这么玩的!一文中我们详细介绍了为什么需要对接口进行限流,也介绍了常见的限流算法,最后还基于Guava工具类实现了接口限流。但是这种方式有个问题,无法实现分布式限流。那今天我们来利用Redis + Lua 来实现分布式限流。

Lua 脚本和 MySQL 数据库的存储过程比较相似,他们执行一组命令,所有命令的执行要么全部成功或者失败,以此达到原子性。也可以把 Lua 脚本理解为,一段具有业务逻辑的代码块。

阅读全文 »

大家好,我是飘渺!

最近发现同事写了不少重复的工具类,发现其中很多功能,SpringBoot 自带的都有。于是整理了本文,希望能够帮助到大家!

断言

  1. 断言是一个逻辑判断,用于检查不应该发生的情况

  2. Assert 关键字在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启

  3. SpringBoot 中提供了 Assert 断言工具类,通常用于数据合法性检查

阅读全文 »

想必大家天天看技术文章应该都看累了吧,今天咱们不谈技术,聊个有意思的话题,即如何为自己构造出一个 职业成长方面动力十足的良性循环系统

什么意思呢?

我相信各位做技术的 “秃头老码农” 肯定都有过或实践过这样一个想法:即通过在上班之余努力学习各种知识、开发技能和思维能力,一段时间后提高我们的工作能力,进而做出更好的工作成绩。这些工作成绩会为我们带来更多的金钱,如升职加薪、当上CTO、迎娶白富美等。
这些钱会对我们构成正面激励,让我们有更大的学习动力去继续学习更多的知识和能力,然后继续这一良性循环。这里我们用一张系统动力图来描述这个循环过程。

阅读全文 »

容器编排工具作为当今最重要的Web开发技术之一,众多强者都在尝试争夺这一行业的主导地位。

Podman是RedHat的一款产品,旨在使用类似于Kubernetes的方法来构建、管理和运行容器,作为一款主流容器的可靠替代产品,它吸引了开发人员的关注。自RHEL 8起,Red Hat用CRI-O/Podman取代了Docker Daemon。为什么Red Hat想要摆脱Docker Daemon?这是因为使用Docker Daemon运行Docker有以下这些问题:

阅读全文 »