国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

聊聊在集群環(huán)境中本地緩存如何進行同步

這篇具有很好參考價值的文章主要介紹了聊聊在集群環(huán)境中本地緩存如何進行同步。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

之前有發(fā)過一篇文章聊聊如何利用redis實現(xiàn)多級緩存同步。有個讀者就給我留言說,因為他項目的redis版本不是6.0+版本,因此他使用我文章介紹通過MQ來實現(xiàn)本地緩存同步,他的同步流程大概如下圖

聊聊在集群環(huán)境中本地緩存如何進行同步,緩存,linq,c#
他原來的業(yè)務(wù)流程是每天凌晨開啟定時器去爬取第三方的數(shù)據(jù),并持久化到redis,后邊因為redis發(fā)生過宕機事故,他碰巧看了我文章,就覺得可以用使用多級緩存的策略,用來做個兜底。他的業(yè)務(wù)流程就如上圖,即每天凌晨開啟定時器去爬取第三方數(shù)據(jù),持久化到redis和其中一臺服務(wù)的本地緩存,然后將爬取到的業(yè)務(wù)數(shù)據(jù)發(fā)送到kafka,其他業(yè)務(wù)服務(wù)通過訂閱kafka,將業(yè)務(wù)數(shù)據(jù)保存到本地緩存。

他改造完,某天突然發(fā)現(xiàn)在集群環(huán)境中,只要其中一臺服務(wù)消費了kafka數(shù)據(jù),其他就消費不到。今天就借這個話題,來聊聊集群環(huán)境中本地緩存如何進行同步

前置知識

kafka消費topic-partitions模式分為subscribe模式和assign模式。subscribe模式需要指定group.id,該模式會為consumer自動分配partition,且同一個group.id下的不同consumer不會消費同樣的分區(qū)。assign模式需要為consumer手動、顯示的指定需要消費的topic-partitions,不受group.id限制,相當與指定的group.id無效。通俗一點講就是assign模式下,所有消費者都可以訂閱指定分區(qū)

我們要通過消息隊列實現(xiàn)本地緩存同步,本質(zhì)上就是需要利用消息隊列提供廣播能力,而kafka默認不具備。不過我們可以根據(jù)kafka提供的消費模式進行定制,從而是kafka也具備廣播能力

集群本地緩存同步方案

方案一:利用MQ廣播能力

因為讀者項目是使用kafka,且項目是使用spring-kafka,我們也就以此為例

1、subscribe模式

通過前置知識,我們了解到在subscribe模式下,同一個group.id下的不同consumer不會消費同樣的分區(qū),這就意味我們可以通過指定不同group.id來消費同樣分區(qū)達到廣播的效果

那如何在同個集群服務(wù)實現(xiàn)不同的group.id?

此時Spring EL 表達式就派上用場了,我們通過 Spring EL 表達式,在每個消費者分組的名字上配合 UUID 生成其后綴。這樣,就能保證每個項目啟動的消費者分組不同,從而達到廣播消費的目的

示例

  @KafkaListener(topics = "${userCache.topic}",groupId =  "${userCache.topic}_group_" + "#{T(java.util.UUID).randomUUID()})")
    public void receive(Acknowledgment ack, String data){
        System.out.println(String.format("serverPort:【%s】,接收到數(shù)據(jù):【%s】",serverPort,data));
        ack.acknowledge();
    }

如果我們決定UUID不直觀,我們也可以使用IP作為標識,只要能保證同個集群服務(wù)的group.id是唯一即可

不過如果要改成ip,我們得做一定的改造。改造步驟如下

a、 獲取ip地址信息,并放入environment

public class ServerAddrEnvironmentPostProcessor implements EnvironmentPostProcessor{



    private String SERVER_ADDRESS = "server.addr";

    @Override
    @SneakyThrows
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        MutablePropertySources propertySources = environment.getPropertySources();
        Map<String, Object> source = new HashMap<>();
        String serverAddr = InetAddress.getLocalHost().getHostAddress();
        source.put(SERVER_ADDRESS,serverAddr);
        MapPropertySource mapPropertySource = new MapPropertySource("serverAddrProperties",source);
        propertySources.addFirst(mapPropertySource);

    }



}

b、 配置spi

在src/main/resource目錄下配置META-INF/spring.factories,配置內(nèi)容如下

org.springframework.boot.env.EnvironmentPostProcessor=\
com.github.lybgeek.comsumer.ip.ServerAddrEnvironmentPostProcessor

c、 @KafkaListener配置如下內(nèi)容

 @KafkaListener(topics = "${userCache.topic}",groupId =  "${userCache.topic}_group_" + "${server.addr}" + "_${server.port}")
小結(jié)

該方式的實現(xiàn)優(yōu)點是比較簡單,但如果需要對服務(wù)進行運維監(jiān)控統(tǒng)計,那就不怎么友好了,雖然指定IP會比隨機UUID好點,但如果是容器化部署,每次部署其IP也是會變化,這樣跟隨機指定UUID,差別也不大了。其次如果是使用云產(chǎn)品,比如阿里云對comsume group是有數(shù)量上限,且消費者組需要提前創(chuàng)建,這種情況使用該方案就不是很合適了

assign模式

通過assign模式手動消費對應(yīng)的分區(qū)

示例

   @KafkaListener(topicPartitions =
            {@TopicPartition(topic = "${userCache.topic}", partitions = "0")})
    public void receive(Acknowledgment ack, ConsumerRecord record){
        System.out.println(String.format("serverPort:【%s】,接收到數(shù)據(jù):【%s】",serverPort,record));
        ack.acknowledge();
    }

小結(jié)

該方式實現(xiàn)也是很簡單,如果我們不需要動態(tài)創(chuàng)建新的分區(qū),用該方案實現(xiàn)廣播,會是一個不錯的選擇。不過該方式的缺點很明顯,因為是手動指定分區(qū),當該分區(qū)有問題,也挺麻煩的

方案二:通過定時器觸發(fā)

該方案主要基于讀者目前的同步進行改造,改造后如下圖

聊聊在集群環(huán)境中本地緩存如何進行同步,緩存,linq,c#

核心就是根據(jù)讀者業(yè)務(wù)的特性,因為他是定時每天晚上同步爬取,那就意味著他這個數(shù)據(jù)至少在當天基本不變,就可以讓集群里的服務(wù)都定時執(zhí)行,此時僅需將xxl-job的調(diào)度策略改成分片廣播就行,這樣就可以持久化到redis的同時,也持久化到本地緩存

小結(jié)

該方案改動量比較小,有個小缺點就是,因為集群內(nèi)所有服務(wù)都執(zhí)行調(diào)度,這樣就會使redis重復(fù)持久化,不過問題也不大就是好。最后讀者選擇該方案

總結(jié)

本文主要闡述集群環(huán)境中本地緩存如何進行同步,之前還有讀者問我說,使用了多級緩存,數(shù)據(jù)一致性要如何保證?以前我可能會從技術(shù)角度來回答,比如你可以延遲雙刪,或者如果你是mysql,你可以使用canal+mq,更甚者你可以使用分布式鎖來保證。但現(xiàn)在我更多從業(yè)務(wù)角度來思考這件事情,你都考慮使用緩存,是不是意味著你在業(yè)務(wù)上是可以容忍一定不一致性,既然可以容忍,是不是最終可以通過一些補償方案來解決這個不一致性

沒有完美的方案,你此時感覺的完美方案,可能是當時在那個業(yè)務(wù)場景下,做了一個貼合業(yè)務(wù)的權(quán)衡

demo鏈接

https://github.com/lyb-geek/springboot-learning/tree/master/springboot-kafka-broadcast文章來源地址http://www.zghlxwxcb.cn/news/detail-660784.html

到了這里,關(guān)于聊聊在集群環(huán)境中本地緩存如何進行同步的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 聊聊不同集群的微服務(wù)如何通過feign調(diào)用

    聊聊不同集群的微服務(wù)如何通過feign調(diào)用

    之前業(yè)務(wù)部門的某項目微服務(wù)調(diào)用關(guān)系如下圖 后因業(yè)務(wù)改造需要,該項目需要將服務(wù)A部署到另外一個集群,但服務(wù)A仍然需要能調(diào)用到服務(wù)B,調(diào)用關(guān)系如下圖 之前調(diào)用方式是負責(zé)服務(wù)B的開發(fā)團隊提供相應(yīng)的feign客戶端包給到服務(wù)A開發(fā)團隊,服務(wù)A開發(fā)團隊直接將客戶端包引入

    2024年02月13日
    瀏覽(17)
  • 聊聊如何在docker環(huán)境中配置hosts

    聊聊如何在docker環(huán)境中配置hosts

    不知道大家有沒有遇到這種場景,部署在docker環(huán)境的項目,需要通過域名訪問外部一些資源,但因為沒有配置dns解析,因此需要通過配置hosts來進行訪問。本文就來聊聊可以通過哪些方式可以在docker容器中配置hosts 方法一:啟動容器的時候加上“–add-host” 示例: 方法二:如

    2024年02月11日
    瀏覽(16)
  • 緩存之美——如何選擇合適的本地緩存?

    小編最近在使用系統(tǒng)的時候,發(fā)現(xiàn)盡管應(yīng)用已經(jīng)使用了redis緩存提高查詢效率,但是仍然有進一步優(yōu)化的空間,于是想到了比分布式緩存性能更好的本地緩存,因此對領(lǐng)域內(nèi)常用的本地緩存進行了一番調(diào)研,有早期的Guava緩存、在Guava上進一步傳承的Caffine以及自稱在Java中使用

    2024年02月03日
    瀏覽(19)
  • Kafka 集群如何實現(xiàn)數(shù)據(jù)同步?

    Kafka 集群如何實現(xiàn)數(shù)據(jù)同步?

    哈嘍大家好,我是咸魚 最近這段時間比較忙,將近一周沒更新文章,再不更新我那為數(shù)不多的粉絲量就要庫庫往下掉了 T﹏T 剛好最近在學(xué) Kafka,于是決定寫篇跟 Kafka 相關(guān)的文章(文中有不對的地方歡迎大家指出) 考慮到有些小伙伴可能是第一次接觸 Kafka ,所以先簡單介紹

    2024年02月05日
    瀏覽(17)
  • 用本地連接集群進行壓力測試,讓你的測試更快更有效!

    用本地連接集群進行壓力測試,讓你的測試更快更有效!

    目錄 引言 背景 詳細步驟 1、首先打開終端 2、安裝kubectl 3、配置kubeconfig 4.準備本地倉庫文件 5.啟動集群執(zhí)行腳本 總結(jié) 測試是軟件開發(fā)中至關(guān)重要的一環(huán),但長時間的等待和低效率的測試卻常常讓人感到煩躁?,F(xiàn)在,我們推出了全新的解決方案:用本地連接集群進行壓力測試

    2024年02月10日
    瀏覽(16)
  • 使用Kind搭建本地k8s集群環(huán)境

    使用Kind搭建本地k8s集群環(huán)境

    目錄 1.前提條件 2.安裝Kind 3.使用Kind創(chuàng)建一個K8s集群 3.1.創(chuàng)建一個雙節(jié)點集群(一個Master節(jié)點,一個Worker節(jié)點) 3.2.驗證一下新創(chuàng)建的集群信息 ?3.3.刪除剛剛新建的集群 ?4.安裝集群客戶端 ?4.1.安裝kubectl 4.1.1.驗證kubectl 4.2.安裝Lens 4.2.1.下載最新Lens安裝包 4.2.2.打開Lens 4.參考文

    2024年02月11日
    瀏覽(30)
  • Zookeeper 集群中節(jié)點之間數(shù)據(jù)是如何同步的

    1.首先集群啟動時,會先進行領(lǐng)導(dǎo)者選舉,確定哪個節(jié)點是 Leader ,哪些節(jié)點是 Follower 和 Observer 2.然后 Leader 會和其他節(jié)點進行數(shù)據(jù)同步,采用發(fā)送快照和發(fā)送 Diff 日志的方式 3.集群在工作過程中,所有的寫請求都會交給 Leader 節(jié)點來進行處理,從節(jié)點只能處理讀請求 4.

    2024年02月09日
    瀏覽(17)
  • git如何同步本地倉庫與遠程倉庫代碼

    fork倉庫代碼至本地后如何同步原倉庫或其他成員倉庫代碼至本地 1、git remote查看遠程倉庫 目前只有origin是因為只是克隆了自己的倉庫,還沒有配置其他遠程倉庫,這是git給予克隆倉庫的默認名 2、git remote add 別名 地址;手動添加需要同步的遠程git倉庫,同時指定一個簡寫

    2024年02月02日
    瀏覽(36)
  • rust里如何快速實現(xiàn)一個LRU 本地緩存?

    LRU是Least Recently Used(最近最少使用)的縮寫,是一種常見的緩存淘汰算法。LRU算法的基本思想是,當緩存空間已滿時,優(yōu)先淘汰最近最少使用的數(shù)據(jù),以保留最常用的數(shù)據(jù)。 在計算機系統(tǒng)中,LRU算法常用于緩存系統(tǒng)、頁面置換算法等場景,以提高數(shù)據(jù)訪問的效率和性能。 要

    2024年02月13日
    瀏覽(28)
  • C#基礎(chǔ):利用LINQ進行復(fù)雜排序

    請你寫出linq對表格排序, CODE=3排前面 ,其余按照 CODE降序 排序,CODE一樣再按照 字母升序 排序 ID CODE VALUE A0001 1 A A0002 1 B A0003 1 C A0004 2 D A0005 2 E A0006 2 F A0007 3 G A0008 3 H A0009 3 I A0010 4 J 若再加大難度,ID=A0005的排第一,然后CODE=3排前面,其余按照CODE降序排序,再按照字母升序排

    2024年01月18日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包