当前位置: 首页 > 知识库问答 >
问题:

springboot - 如何实现本地缓存自动更新?

宦砚
2024-02-27

背景: 项目里使用了Guava本地缓存,缓存了数据库的一部分数据,项目使用K8S部署,大概有10台左右的机器。当数据库更新时,希望所有机器的缓存同步更新。目前采用的是canal监听binlog + 刷入kafka。基于此场景,所以项目使用了广播模式来消费kafak的消息。

问题:由于机器的数目会基于整体压力动态变化,并不是固定数量,所以我们在项目里并没有写死消费者组ID,而是采用了随机数目的方式。但是每次重启容器都会造成kafka的消息堆积,虽然关掉的这个容器的消费者组状态已经是empty了,但不知为什么,腾讯云会保留empty消费者组然后消息堆积,然后就告警。时间一长就会掩盖真正的消息堆积error。虽然可以每次重启后都去删除empty消费者组,但是这样太麻烦了。以后要是100台机器,部署一次就得删100次(这玩意儿还不能多选只能一个个删)

我想追求的是:每个服务的消费者组ID是固定的。
比如:假设现在有4个节点组成的集群,那么消费者组id最好为consumer1-4. 如果扩容到20台,那么他会自动的变为consumer1-20. 如果其中一个节点挂掉了,比如consumer16挂掉,过了一会k8s自己恢复了,我希望新启动的机器自动基础consumer16这个ID。如果此时缩容了,比如由20台缩容到了10台,我希望消费者组ID变为consumer1-10;

又或者?我不用广播模式,而是所有节点用一个消费者组,其中一个消费者消费后,主动轮询调用所有节点的接口去更新缓存(异步)?那这还得维护一个节点的列表。

大家觉得哪种方式更好?或者有其他解决方法?

共有1个答案

宋典
2024-02-27

对于你的问题,我有以下几种解决方案:

方案一:动态消费者组ID

你可以考虑使用一些能够动态管理消费者组的工具,如Spring Cloud Stream。它可以根据你的应用所在的动态集群自动创建和删除消费者组。

你只需要将每个服务看作一个消息代理,服务启动时会自动加入到对应的消费者组中,服务停止时会自动离开消费者组。消费者组ID可以基于服务实例的名称或ID动态生成。这样,即使有节点挂掉或者新加入节点,消费者组也会自动适应。

Spring Cloud Stream支持多种消息中间件,包括Kafka,RabbitMQ等。你可以根据你的需求选择合适的消息中间件。

方案二:使用分布式锁

你可以使用分布式锁来保证同一时间只有一个节点更新缓存。当数据库有更新时,首先获取分布式锁,然后更新缓存,最后释放分布式锁。这样可以避免多个节点同时更新缓存造成的数据不一致问题。

常见的分布式锁有Zookeeper,Redis等。你可以根据项目需求选择合适的分布式锁。

方案三:使用消息队列进行通知

当数据库有更新时,将更新事件发送到消息队列中,然后由一个单独的服务消费消息队列中的事件,并通知其他节点更新缓存。这样可以保证所有节点都能及时获取到数据库的更新事件,并更新本地缓存。

你可以选择Kafka,RabbitMQ等作为消息队列。

以上三种方案都可以解决你的问题,你可以根据你的项目需求选择合适的方案。

 类似资料:
  • 本文向大家介绍Java LocalCache 本地缓存的实现实例,包括了Java LocalCache 本地缓存的实现实例的使用技巧和注意事项,需要的朋友参考一下 源码地址: GitHub 使用场景 在Java应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中。相对从数据库中读取来说,读缓存效率会有很大提升。 在集群环境下,常用的分布式缓存有Redis、Memcached等。但

  • Serenity 提供一些缓存抽象和实用功能让你更容易地使用本地缓存。 术语 本地(local) 的意思是指在本地内存中缓存项目(因此没有涉及到序列化)。 当你的应用程序在网站群(web farm) 中部署时,本地缓存可能还不够或者有时合适。我们将在 分布式缓存 章节中讨论该场景。

  • 本文向大家介绍springboot的缓存技术的实现,包括了springboot的缓存技术的实现的使用技巧和注意事项,需要的朋友参考一下 引子 我门知道一个程序的瓶颈在于数据库,我门也知道内存的速度是大大快于硬盘的速度的。当我门需要重复的获取相同的数据的时候,我门一次又一次的请求数据库或者远程服务,导致大量的时间耗费在数据库查询或者远程方法的调用上,导致程序性能的恶化,这更是数据缓存要解决的问题。

  • 本文向大家介绍Android如何实现APP自动更新,包括了Android如何实现APP自动更新的使用技巧和注意事项,需要的朋友参考一下 先来看看要实现的效果图: 对于安卓用户来说,手机应用市场说满天飞可是一点都不夸张,比如小米,魅族,百度,360,机锋,应用宝等等,当我们想上线一款新版本APP时,先不说渠道打包的麻烦,单纯指上传APP到各大应用市场的工作量就已经很大了,好不容易我们把APP都上传完

  • 本文向大家介绍Java中LocalCache本地缓存实现代码,包括了Java中LocalCache本地缓存实现代码的使用技巧和注意事项,需要的朋友参考一下 前言 本次分享探讨java平台的本地缓存,是指占用JVM的heap区域来缓冲存储数据的缓存组件。 一、本地缓存应用场景 localcache有着极大的性能优势: 1. 单机情况下适当使用localcache会使应用的性能得到很大的提升。 2.