Java生鮮電商平臺-緩存架構實戰

?

Java生鮮電商平臺-緩存架構實戰

?

說明:在Java生鮮電商中,緩存起到了非常重要的作用,目前整個項目中才用的是redis做分布式緩存.

緩存集群

緩存集群存在的問題

1.熱key
緩存集群中的某個key瞬間被數萬甚至十萬的并發請求打爆。


2.大value
某個key對應的value可能有GB級的大小,導致查詢value的時候導致網絡相關的故障問題。

緩存集群作用

在緩存里放一些平時不怎么變動的數據,然后用戶在查詢大量的平時不怎么變動的數據的時候,可以直接從緩存里走了。緩存集群的并發能力是很強的,而且讀緩存的性能是很高的。

緩存實踐案例

  • 假設系統每秒有2萬請求,但是其中90%都是讀請求,假如每秒1.8萬請求都是在讀一些不太變化的數據。那此時你把這些數據都放在數據庫里,然后每秒發送2萬請求到數據庫上讀寫數據,感受一下這樣合適?
  • 如果要用數據庫承載每秒2萬請求的話,那很可能就得搞分庫分表 + 讀寫分離。
  • 那得分3個主庫,承載每秒2000的寫入請求,然后每個主庫掛3個從庫,一共9個從庫承載每秒1.8萬的讀請求。
  • 這樣的話,就需要一共是12臺高配置的數據庫服務器,這是很耗費錢的,成本非常高,很不合適。
  • 因此,可以把平時不太變化的數據放在緩存集群里,緩存集群可以采用2主2從,主節點用來寫入緩存,從節點用來讀緩存。
  • 以緩存集群的性能,2個從節點完全可以用來承載每秒1.8萬的大量讀請求,然后3個數據庫主庫就是承載每秒2000的寫請求和少量其他讀請求就OK了(數據一致性問題)。
  • 這樣一來,耗費的機器瞬間變成了4臺緩存機器 + 3臺數據庫機器 = 7臺機器,是不是比之前的12臺機器減少了很大的資源開銷?
  • 緩存其實在系統架構里是非常重要的組成部分。很多時候,對于那些很少變化但是大量高并發讀的數據,通過緩存集群來抗高并發讀,是非常合適的。

熱點緩存

  • 所謂熱點緩存問題就是突然因為莫名的原因,出現大量的用戶訪問同一條緩存數據。碰巧這些key都存在于一臺緩存機器上。
  • 假設每秒突然奔過來20萬請求到這臺機器上,那臺被20萬請求指向的緩存機器就會過度操勞而宕機的。
  • 讀請求發現讀不到數據,會從數據庫里提取原始數據,然后放入剩余的其他緩存機器里去。但是接踵而來的每秒20萬請求,會再次壓垮其他的緩存機器。
  • 以此類推,最終導致緩存集群全盤崩潰,引發系統整體宕機。

基于流式計算技術的緩存熱點自動發現

  • 其實這里關鍵的一點,就是對于這種熱點緩存,你的系統需要能夠在熱點緩存突然發生的時候,直接發現他,然后瞬間立馬實現毫秒級的自動負載均衡。
  • 一般出現緩存熱點的時候,每秒并發肯定是很高的,可能每秒都幾十萬甚至上百萬的請求量過來,這都是有可能的。
  • 所以,此時完全可以基于大數據領域的流式計算技術來進行實時數據訪問次數的統計,比如storm、spark streaming、flink。
  • 一旦在實時數據訪問次數統計的過程中,比如發現一秒之內,某條數據突然訪問次數超過了1000,就直接立馬把這條數據判定為是熱點數據,可以將這個發現出來的熱點數據寫入比如zookeeper中(監聽事件)。
  • 流式計算系統在進行數據訪問次數統計的時候,會不會也存在說單臺機器被請求每秒幾十萬次的問題呢?否!!!
  • 流式計算技術,尤其是storm這種系統,他可以做到同一條數據的請求過來,先分散在很多機器里進行本地計算,最后再匯總局部計算結果到一臺機器進行全局匯總。
  • 所以幾十萬請求可以先分散在比如100臺機器上,每臺機器統計了這條數據的幾千次請求。
  • 然后100條局部計算好的結果匯總到一臺機器做全局計算即可,所以基于流式計算技術來進行統計是不會有熱點問題的。

熱點緩存自動加載為JVM本地緩存

  • 我們自己的系統可以對zookeeper指定的熱點緩存對應的znode進行監聽,如果有變化立馬就可以感知到了。
  • 此時系統層就可以立馬把相關的緩存數據從數據庫加載出來,然后直接放在自己系統內部的本地緩存里即可。
  • 這個本地緩存,用ehcache、hashmap,其實都可以,一切看自己的業務需求。我們這里主要說的就是將緩存集群里的集中式緩存,直接變成每個系統自己本地實現緩存即可,每個系統本地是無法緩存過多數據的。
  • 因為一般這種普通系統單實例部署機器可能就一個4核8G的機器,留給本地緩存的空間是很少的,所以用來放這種熱點數據的本地緩存是最合適的,剛剛好。
  • 假設系統層集群部署了100臺機器,此時你100臺機器瞬間在本地都會有一份熱點緩存的副本。
  • 然后接下來對熱點緩存的讀操作,直接系統本地緩存讀出來就給返回了,不用再走緩存集群了。
  • 這樣的話,變成100臺機器每臺機器承載數千請求,那么那數千請求就直接從機器本地緩存返回數據了,這是沒有問題的。

限流熔斷保護

  • 在每個系統內部,還應該專門加一個對熱點數據訪問的限流熔斷保護措施。
  • 每個系統實例內部,都可以加一個熔斷保護機制,假設緩存集群最多每秒承載4萬讀請求,那么你一共有100個系統實例。
  • 應該提前限制好,每個系統實例每秒最多請求緩存集群讀操作不超過400次,一超過就可以熔斷掉,不讓請求緩存集群,直接返回一個空白信息,然后用戶稍后會自行再次重新刷新頁面之類的。
  • 通過系統層自己直接加限流熔斷保護措施,可以很好的保護后面的緩存集群、數據庫集群之類的不要被打死。


轉載于:https://www.cnblogs.com/jurendage/p/11269241.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247326.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java生鮮電商平臺-深入理解微服務SpringCloud各個組件的關聯與架構

Java生鮮電商平臺-深入理解微服務SpringCloud各個組件的關聯與架構 概述 毫無疑問,Spring Cloud是目前微服務架構領域的翹楚,無數的書籍博客都在講解這個技術。不過大多數講解還停留在對Spring Cloud功能使用的層面,其底層的很多原理&#xf…

Angular自學筆記(?)DI提供者

類提供者 類提供者的創建和使用 假設有logger類: import {Injectable } from @angular/core;@Injectable() export class LoggerService {logs: string[] = [

Angular自學筆記(?)生命周期

從實例化組件,渲染組件模板時,各聲明周期就已開始 ngOnChanges 輸入屬性發生變化是觸發,但組件內部改變輸入屬性是不會觸發的 import {Component, Input, OnInit, OnChanges } from @angular/core;@Component({selector: app-life-cycle,templateUrl:

[轉載]httpClient.execute拋Connection to refused異常問題

在4.0之后android采用了嚴格模式:所以在你得activity創建的時候,在super.onCreate(savedInstanceState);后面加上這個 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites(…

Angular自學筆記(?)依賴注入

什么是依賴注入 依賴注入(DI)是一種設計模式, 也有相應的框架,比如InversifyJS Angular 有自己的 DI 框架, DI 框架會在實例化該類時向其提供這個類所聲明的依賴項 帶修飾符的參數 在ts中,一個類的參數如果帶上修飾符,那個參數就變成了類的實例屬性 class Mobile {co…

MSN8.0經常出現連接錯誤,如何解決?

連接錯誤有很多種情形,請您先查看下連接錯誤代碼 然后可以嘗試以下解決辦法--------- 如何解決錯誤 81000301 或 81000306 您登錄 MSN Messenger 時,可能會收到以下錯誤消息: 我們無法讓您登錄到 MSN Messenger,可能是因為服務或 …

@ViewChild 的三種常用方法

//--1------ 在angular中進行dom操作 <div #dom>這是一個div</div> //放置一個錨點domimport { ElementRef, ViewChild } from angular/core;ViewChild(dom,{static:true}), eleRef:ElementRef; //static-True表示在運行更改檢測之前解析查詢結果&#xff0c;false…

SQL Server安裝文件掛起錯誤解決辦法

以前在安裝sql的時候&#xff0c;如此提示&#xff0c;我只要重新啟動即可&#xff0c;可是今天重新啟動了N次計算機&#xff0c;問題卻絲毫沒有解決&#xff0c;依然提示這樣的話。“以前的某個程序安裝已在安裝計算機上創建掛起的文件操作。運行安裝程序之前必須重新啟動計算…

angular 內容投影

app HTML <div class"wrapper"><h2>我是父組件</h2><div>這個div定義在父組件中</div><app-child><div class"header">這個div是父組件投影到子組件的1, {{title}}</div><div class"footer"…

移動端日歷插件

//datePicker日期控件 v1.0//var calendar new datePicker();//calendar.init({// trigger: #demo1, /*選擇器&#xff0c;觸發彈出插件*/// type: date,/*date 調出日期選擇 datetime 調出日期時間選擇 time 調出時間選擇 ym 調出年月選擇*/// minDate:1900-1-1,/*最小日期*/…

js 操作location URL對象進行操作

把location 創建URL對象 構造器 new URL() 創建并返回一個URL對象&#xff0c;該URL對象引用使用絕對URL字符串&#xff0c;相對URL字符串和基本URL字符串指定的URL。 屬性 hash 包含#的USVString&#xff0c;后跟URL的片段標識符。 host 一個USVString&#xff0c;其中…

aspx,ascx和ashx使用小結

做asp.net開發的對.aspx,.ascx和.ashx都不會陌生。關于它們&#xff0c;網上有很多文章介紹。“紙上得來終覺淺&#xff0c;絕知此事要躬行”&#xff0c;下面自己總結一下做個筆記。 1、.aspx Web窗體設計頁面。Web窗體頁由兩部分組成&#xff1a;視覺元素&#xff08;html、服…

vue3.x通過ref屬性獲取元素

在vue2.x中&#xff0c;可以通過給元素添加refxxx屬性&#xff0c;然后在代碼中通過this.$refs.xxx獲取到對應的元素 然而在vue3中時沒有$refs這個東西的&#xff0c;因此vue3中通過ref屬性獲取元素就不能按照vue2的方式來獲取vue3需要借助生命周期方法&#xff0c;原因很簡單…

vue3+TypeScript封裝echarts5組件

https://blog.csdn.net/qq_38330707/article/details/111497853 有用mark 等抽時間寫個vueTSecharts5.0的組件文章 寫個大概 帶 resize的 <template><div class"echarts" :id"id"></div> </template><script lang"ts&q…

How to Register COM in VS

在 Visual Studio .Net 部署項目中注冊 COM 模塊的步驟 將 COM 對象添加到 Visual Studio 部署項目。在解決方案資源管理器中&#xff0c;右鍵單擊剛添加的模塊&#xff0c;然后單擊屬性。注意&#xff1a;“屬性”窗口包含一個表&#xff0c;其中有兩列和 x 行&#xff08;行數…

css3 卡片hover3D效果

鼠標hover卡片 向上翻轉&#xff0c;看簡易代碼 <!DOCTYPE html> <html> <head><title>3D Flip Card hover effects</title><style type"text/css">* {margin: 0;padding: 0;font-family: consolas;box-sizing: border-box;}bo…

隨便貼兩個漏洞,如 Apache JServ協議服務

1、Apache JServ協議服務 描述&#xff1a;Apache JServ協議&#xff08;AJP&#xff09;是一種二進制協議&#xff0c;可以將來自Web服務器的入站請求代理到 位于Web服務器后面的應用程序服務器。不建議在互聯網上公開使用AJP服務。 如果AJP配置錯誤&#xff0c;可能會允許攻擊…

vue3學習筆記 Composition API setup

一、Composition API優勢 相對于vue2的option API Vue3的Composition API設計更有優勢 Composition(組合式)Api 功能分組 Composition(組合式)Api 功能導入復用 組合式Api 所解決的問題 (1) 更好的代碼組織結構 (2) 相同的代碼邏輯可以進行復用 home.vue 3種方式遞進升級…

【TCP傳輸數據-鍵盤錄入】

package com.yjf.esupplier.common.test;import java.io.*; import java.net.Socket;/*** author shusheng* description TCP 傳輸數據:鍵盤錄入* Email shushengyiji.com* date 2019/1/15 22:57*/ public class ClientDemo1 {public static void main(String[] args) throws I…

04

1、創建/guanli 目錄&#xff0c;在/guanli下創建zonghe 和 jishu 兩個目錄&#xff08;一條命令&#xff09; [rootlocalhost ~]# mkdir /guanli [rootlocalhost ~]# touch /guanli/zonghe [rootlocalhost ~]# touch /guanli/jishu [rootlocalhost ~]# ls /guanlix 2、添加組帳…