Clay 的技术空间

用进废退 | 艺不压身

前言

集群模式

RabbitMQ 是用 Erang 开发的,集群模式分为两种普通模式镜像模式,可以说镜像模式普通模式的升级版,其中 RabbitMQ 默认使用的是 普通模式

  • 普通模式:
    以两个节点(rabbit01、rabbit02)为例来进行说明,rabbit01 和 rabbit02 两个节点仅有相同的元数据,即队列的结构,但消息实体只存在于其中一个节点 rabbit01(或者 rabbit02)中。当消息进入 rabbit01 节点的 Queue 后,consumer 从 rabbit02 节点消费时,RabbitMQ 会临时在 rabbit01、rabbit02 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer。所以 consumer 应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理 Queue。否则无论 consumer 连 rabbit01 或 rabbit02,出口总在 rabbit01,会产生瓶颈。当 rabbit01 节点故障后,rabbit02 节点无法取到 rabbit01 节点中还未消费的消息实体。如果做了消息持久化,那么得等 rabbit01 节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。

  • 镜像模式:
    在普通模式的基础上,把需要的队列做成镜像队列,存在于多个节点,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取,也就是说多少节点消息就会备份多少份。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在对业务可靠性要求较高的场合中适用。由于镜像队列之间消息自动同步,且内部有选举 Master 机制,即使 Master 节点宕机也不会影响整个集群的使用,达到去中心化的目的,从而有效的防止消息丢失及服务不可用等问题

集群节点的区别

RabbitMQ 的集群节点分为磁盘节点、内存节点。RabbitMQ 支持消息的持久化,也就是数据写在磁盘上。在 RabbitMQ 集群中,必须至少有一个磁盘节点,否则队列元数据无法写入到集群中。当磁盘节点宕掉时,集群将无法写入新的队列元数据信息。如果 RabbitMQ 集群全部宕机,必须先启动磁盘节点,然后再启动内存节点。最合适的方案就是既有磁盘节点,又有内存节点,推荐 1 个 磁盘节点 + 2 个内存节点的集群搭建方式。

阅读全文 »

前言

Vuepress v1 博客建议安装 vuepress-plugin-readmore-popular 插件,将 TechGrow 的免费微信公众号导流工具整合到博客中,用户扫码关注微信公众号后可以解锁全站文章,让微信公众号的粉丝数躺着增长。

提示

  1. TechGrow 开放平台的 官方文档
  2. vuepress-plugin-readmore-popular 插件只支持 Vuepress v1,不支持 Vuepress v2
  3. 若使用的是 Vuepress v2 静态博客,建议直接安装 vuepress-plugin-readmore-popular-next 插件,详细教程可点击这里

特色功能

  • 支持随机为博客添加导流功能
  • 支持关闭某篇文章的导流功能
  • 支持查询用户解锁文章的历史记录
  • 支持自定义或者动态计算文章内容的预览高度
  • 支持自定义 CSS 样式,轻松适配不同风格的博客
阅读全文 »

前言

本文主要介绍 Spring Boot 项目如何集成 Alibaba 的 OSS 服务(对象存储),教程内容同样适用于 Spring Cloud 项目。

提示

1、Spring Cloud 项目不建议继续使用 spring-cloud-starter-alicloud-oss 组件,尤其是较新版本的 Spring Cloud(例如 2021.0.1 版本),毕竟 Alibaba OSS 的官方文档也移除了该组件的使用说明。
2、Alibaba OSS 更多的使用教程请查看 官方文档

版本说明

Spring BootSpring Boot Alibaba
2.6.31.0.0
阅读全文 »

大纲

双亲委派机制

双亲委派机制(Parent Delegation Model)是 Java 类加载器的一种工作机制,其基本原则是:每个类加载器在接收到类加载请求时,会先将该请求委派给它的父类加载器处理,只有在父类加载器无法完成该请求时,才由自己来加载。通过这种机制,可以防止内存中出现多份同样的字节码(从安全性角度考虑),同时确保了核心类库始终由启动类加载器加载,避免了自定义类库对核心类库的破坏。这种层次化的加载过程有助于提升系统的安全性和稳定性,同时也便于管理不同级别的类库。比如,加载位于 $JAVA_HOMEjre/lib/rt.jar 包中的 Object 类时,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object 对象。

阅读全文 »

大纲

前言

官方文档

简单介绍

Spring Cache 是 Spring 提供的一个缓存框架,从 Spring 3.1 版本开始支持将缓存添加到现有的 Spring 应用程序中,从 Spring 在 4.1 版本开始,缓存已支持 JSR-107 注释和更多自定义的选项。Spring Cache 利用了 AOP,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解就能实现缓存功能,做到了较小的代码侵入性。由于市面上的缓存工具实在太多,Spring Cache 框架还提供了 CacheManager 接口,可以实现降低对各种缓存框架的耦合;它不是具体的缓存实现,只是提供一整套的接口和代码规范、配置、注解等,用于整合各种缓存方案,比如 Ehcache、Caffeine、Hazelcast、Couchbase 等。

阅读全文 »

前言

Rsync 是一个增量备份工具,可压缩数据传输,速度快且增量备份,占用流量少。

准备工作

创建用户

1
2
3
4
5
# 创建用户组
# groupadd www

# 创建用户
# useradd -g www www -s /bin/false
阅读全文 »

大纲

前言

JVM 调优,调的是稳定,并不能让性能得到大幅提升。服务稳定的重要性就不用多说了,保证服务的稳定,GC 永远会是 JAVA 程序员需要考虑的不稳定因素之一。复杂和高并发下的服务,必须保证每次 GC 不会出现性能下降,各种性能指标不会出现波动,GC 回收规律而且干净,找到合适的 JVM 设置。比如,FULL GC 最会影响性能,根据代码问题,避免 FULL GC 频率。可以适当调大年轻代的容量,让大对象可以在年轻代触发 YONG GC,调整大对象在年轻代的回收频次,尽可能保证大对象在年轻代回收,减小老年代缩短回收时间。

阅读全文 »