日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微服务化后缓存怎么做?

發布時間:2024/9/27 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微服务化后缓存怎么做? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

戳藍字“CSDN云計算”關注我們哦!

技術頭條:干貨、簡潔、多維全面。更多云計算精華知識盡在眼前,get要點、solve難題,統統不在話下!

??

作者:cnstonefang

轉自:?方丈的寺院


摘要

最近接手的代碼中遇到幾個緩存的問題,存在一些設計原則的問題,這里總結一下,希望可以對你有幫助

問題

問題1: 店鋪數據的獲取,將用戶關注的數據放在店鋪信息一起返回

對外提供的接口

  • List<Shop> getPageShop(final Query query,final Boolean cache);

  • 返回的店鋪信息

  • public class Shop {


  • public static final long DEFAULT_PRIORITY = 10L;


  • /**

  • * 唯一標識

  • */

  • private Long id;

  • //省略了店鋪其他信息

  • /**

  • * 用戶關注

  • */

  • private ShopAttention attention;

  • }

  • 當調用方設置cache為true時,因為有緩存的存在,獲取不到用戶是否關注的數據。

    問題2: 統計店鋪的被關注數導致的慢SQL,導致數據庫cpu飆高,影響到了整個應用

    SQL

  • SELECT shop_id, count(user_Id) as attentionNumber

  • FROM shop_attention

  • WHERE shop_id IN

  • <foreach collection="shopIds" item="shopId" separator="," open="(" close=")">

  • #{shopId}

  • </foreach>

  • GROUP BY shopId

  • 這兩種代碼的寫法都是基于一個基準

    不同的地方的緩存策略不一樣,比如我更新的地方,查找數據時不能緩存,頁面展示的查找的地方需要緩存。 既然服務提供方不知道該不該緩存,那就不管了,交給調用方去管理

    這種假設本身沒什么問題,但是忽略了另外一個原則,服務的內聚性。不應該被外部知道的就沒必要暴露給外部

    無論是面向過程的C,還是面向對象的語言,都強調內聚性,也就是高內聚,低耦合。單體應用中應當遵循這個原則,微服務同樣遵循這個原則。但是在實際過程中,我們發現做到高內聚并不簡單。我們必須要時時刻刻審視方法/服務的邊界,只有確定好職責邊界,才能寫出高內聚的代碼

    問題分析

    第一個問題,從緩存的角度來看,是忽略了數據的更新頻繁性以及數據獲取的不同場景。

    對于店鋪這樣一個大的聚合根,本身包含的信息很多,有些數據可能會被頻繁更改的,有些則會很少更新的。那么不同的修改頻率,是否緩存/緩存策略自然不同,使用同一個參數 Booleancache來控制顯然不妥

    第二個問題,這種統計類的需求使用SQL統計是一種在數據量比較小的情況下的權宜之計,當數據規模增大后,必須要使用離線計算或者流式計算來解決。它本身是一個慢SQL,所以必須要控制號調用量,這種統計的數據量的時效性應該由服務方控制,不需要暴露給調用方。否則就會出現上述的問題,調用方并不清楚其中的邏輯,不走緩存的話就會使得調用次數增加,QPS的增加會導致慢SQL打垮數據庫

    解法

    緩存更新本身就是一個難解的問題,在微服務化后,多個服務就更加復雜了。涉及到跨服務的多級緩存一致性的問題。

    所以對大部分的業務,我們可以遵循這樣的原則來簡單有效處理。

    • 對數據的有效性比較敏感的調用都收斂到服務內部(領域內部應該更合適),不要暴露給調用方, 領域內部做數據的緩存失效控制

    • 緩存預計算(有些頁面的地方不希望首次打開慢)的邏輯也應該放在領域內控制,不要暴露給調用方。 在領域內部控制在不同的地方使用不同的緩存策略,比如更新數據的地方需要獲取及時的數據。比如商品的價格,和商品的所屬類目更新頻次不同,需要有不同的過期時間。

    • 跨服務調用為了減少rpc調用,可以再進行一層緩存。因為這些調用可以接受過期的數據,再進行一層緩存沒問題,expired time疊加也沒多大影響(expire time在這邊主要是影響緩存的命中數)

    以上述店鋪查詢問題改造為例擴展:如果后續有case在跨服務的調用時,對數據的過期比較敏感,并且在調用方也做了緩存,那就是跨服務的多級緩存一致性的問題。那就需要服務方告知調用方緩存何時失效,使用消息隊列or其他方式來實現。

    參考

    https://martin.kleppmann.com/2012/10/01/rethinking-caching-in-web-apps.html



    福利

    掃描添加小編微信,備注“姓名+公司職位”,加入【云計算學習交流群】,和志同道合的朋友們共同打卡學習!



    推薦閱讀:

    • 10 種最流行的 Web 挖掘工具 | 程序員硬核評測

    • 《復聯4》| 生活需要漫威這塊糖

    • 如何向 6 歲的孩子解釋編程?這個解釋厲害了

    • “踏實工作 7 年,辭職時老板頭都不抬”

    • 60倍回報! AI工程師用OpenAI創建了一個比特幣自動交易工具! 這里是詳細做法 | 技術頭條

    • 賭5毛錢,你解不出這道Google面試題


    真香,朕在看了!

    總結

    以上是生活随笔為你收集整理的微服务化后缓存怎么做?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。