微服務架構下的緩存系統(tǒng)設計(一)


title: 微服務架構下的緩存系統(tǒng)設計(一)
date: 2018-12-15 13:25:45
tags:

  • 微服務
  • 分布式
  • 緩存
  • Redis
    categories:
  • 微服務

說到互聯網時代,可能對于技術人員來說,就是大數據、高并發(fā)、分布式等各種代名詞。尤其是當下十分火熱的微服務,當然微服務的生態(tài)過于龐大,我們暫且不討論,今天來說一下在微服務中如何設計一個緩存系統(tǒng),這是我在項目中的總結,不對之處還請大家指正。

首先問大家一個問題,為什么要使用緩存系統(tǒng)?

這個問題留給大家去思考。

首先我們要說一下這個緩存系統(tǒng)針對的目標是什么,在我的個人項目中,使用到緩存的地方大概有三處:

  • 用戶基本信息
  • Mybatis的二級緩存
  • 一些其他的靜態(tài)信息
  • 當然也使用了Redis做了短信服務的頻次控制

我們可以發(fā)現這些數據有一些特點:

  • 更改頻率比較低
  • 要求準確率和實時性比較高
    當然具體的數據劃分還要根據業(yè)務的需求來做。

下面我們來看一下我在項目中的緩存系統(tǒng)設計

緩存系統(tǒng)設計圖

緩存系統(tǒng)設計圖

我們以某個業(yè)務服務為例,可以看到我們的核心模塊:

  • 數據操作入口
  • 持久化的隊列
  • 數據校驗服務
  • 緩存處理程序
  • 數據一致性檢查服務
  • Redis HA
  • MySQL HA

我們來分別說一下他們的作用,

數據操作入口

我們都知道,我們的服務往往跨越了多個終端,移動、web、以及C端,某個業(yè)務如果分別對這些終端提供數據操作入口,那么很容易引起數據的一致性問題,另一方面,數據操作的管理及其復雜,重復代碼變多,那么這時候提供一個統(tǒng)一的操作入口,對外發(fā)布統(tǒng)一的接口就變得尤為重要。

數據校驗服務

當然這個服務各有見解,根據不同的業(yè)務需求對數據做一些業(yè)務上的校驗或者數據庫約束性的校驗,對一些簡單的校驗可以在Web層提供統(tǒng)一的校驗,復雜的業(yè)務校驗我認為還是要在service層進行。

持久化的隊列

我相信大家對微服務中提倡的一個概念一定很熟悉,那就是解耦合,各個服務之間是獨立的。

我們來思考一下,去掉隊列之后,數據可以直接在更新到mysql之后進行緩存,好像并沒有什么影響,但是擴展性好像差了一些。

這里使用隊列不僅僅是單獨為緩存服務提供的,我以項目中的訂單系統(tǒng)為例,給大家看一下,MQ在業(yè)務中的作用,

訂單系統(tǒng)

大家可以看到在訂單系統(tǒng)下單持久化之后,將訂單信息發(fā)送到延時隊列中,這里為什么要使用延時隊列呢?因為用戶下單之后有一個支付的時間,所以要有一定的期限供用戶支付。MQ在這里另外一方面的作用就是異步操作,大家可以想一下,在高并發(fā)下,同步能否抗的?。?/p>

好了,我們回到緩存系統(tǒng),為什么要采用持久化的隊列?開頭我們說過,這些數據是要求準確性的,所以在這一系列流程中,很有可能因為網絡波動,或者業(yè)務服務自身問題造成數據的丟失,為了解決這些問題,我們還需要使用MQ的ack機制(缺點是重復數據與性能低(大家可以想一下tcp的ack機制)),當然如何抉擇還是根據具體的業(yè)務來做。

緩存處理程序

緩存處理程序無非是把我們的業(yè)務數據轉換成Redis支持的數據類型,項目中,為了方便(),我大部分使用的json的序列化機制,Redis客戶端我選擇的基于Jedis的RedisTemplate,當然也可以選擇使用luttuce,luttuce提供了更多優(yōu)秀的特性,大家可以自己了解。這里有一點希望大家注意的是,對于數值型的字符串,使用json進行序列化時是無法使用Redis的incr操作的,只能選擇在業(yè)務中進行操作,因為可以選擇使用StringRedisSerializer來對數值型的數據進行序列化。

數據一致性檢查

為什么需要數據一致性檢查?因為我們的DB持久化操作與緩存操作是異步的,難免在DB持久化之后,緩存的過程中出現異常,或者HA集群在主從同步的時候發(fā)生異常,這時候一致性檢查就顯得尤為重要,但是一致性檢查同時也帶來了新的問題,那就是對DB的壓力,所以沒有什么方案是最好的,只能在HA與一致性作出抉擇。

在一致性檢查之外,我們還可以選擇另外一種方案,那就是過期策略,過期策略不需要一致性檢查,但是他的問題在于過期時間的選擇,大量數據過期引發(fā)的緩存穿透和雪崩又需要我們在服務中提供新的解決方案,例如:緩存的持久化方案:例如RDB、AOF,服務上線前的緩存預熱、服務降級、熔斷的策略、采用二級緩存或者專門針對緩存服務的降級:頁面降級、讀寫降級等。

總結

總的來說,緩存服務是業(yè)務中必不可少的一環(huán),我們應該考慮提供統(tǒng)一的緩存服務,并針對不同的業(yè)務進行優(yōu)化和定制。這一篇主要是對緩存整體架構的說明,后面的文章將詳細的介紹緩存的實際使用以及Redis的相關知識。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容