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)設計圖

我們以某個業(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)下單持久化之后,將訂單信息發(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的相關知識。