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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

从构建分布式秒杀系统聊聊WebSocket推送通知

發布時間:2024/4/13 windows 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从构建分布式秒杀系统聊聊WebSocket推送通知 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

秒殺架構到后期,我們采用了消息隊列的形式實現搶購邏輯,那么之前拋出過這樣一個問題:消息隊列異步處理完每個用戶請求后,如何通知給相應用戶秒殺成功?

場景映射

首先,我們舉一個生活中比較常見的例子:我們去銀行辦理業務,一般會選擇相關業務打印一個排號紙,然后就可以坐在小板凳上玩著手機,等待被小喇叭報號。當小喇叭喊到你所持有的號碼,就可以拿著排號紙去柜臺辦理自己的業務。

這里,假設當我們取排號紙的時候,銀行根據時間段內的排隊情況,比較人性化的提示用戶:排隊人數較多,您是否繼續等待?否的話我們可以換個時間段再來辦理。

由此我們把生活場景映射到真實的秒殺業務邏輯中來:

  • 我們可以把柜臺比喻成商品下單處理邏輯單元
  • 拿到排號紙說明你進入相應商品處理隊列
  • 拿到排號紙的請求直接返回前臺,提示用戶搶購進行中
  • 排號紙進入隊列后,等待商品業務處理邏輯
  • 小喇叭叫到自己的排號相當于服務端通知用戶秒殺成功,這時候可以進行支付邏輯
  • 那些拿不到票號的同學,相當于隊列已滿直接返回秒殺失敗

解決方案

通過上面的場景,我們很容易能夠想到一種方案就是服務端通知,那么如何做到服務端異步通知的呢?下面,主角開始登場了,就是我們的Websocket。

WebSocket是HTML5開始提供的一種瀏覽器與服務器間進行全雙工通訊的網絡技術。依靠這種技術可以實現客戶端和服務器端的長連接,雙向實時通信。

特點:

  • 異步、事件觸發
  • 可以發送文本,圖片等流文件
  • 數據格式比較輕量,性能開銷小,通信高效
  • 使用ws或者wss協議的客戶端socket,能夠實現真正意義上的推送功能

缺點:

  • 部分瀏覽器不支持,瀏覽器支持的程度與方式有區別,需要各種兼容寫法。

集成案例

由于我們的秒殺架構項目案例中使用了SpringBoot,因此集成webSocket也是相對比較簡單的。

首先pom.xml引入以下依賴:

WebSocketConfig 配置:

WebSocketServer 配置:

KafkaConsumer 消費配置,通知用戶是否秒殺成功:

webSocket.js 前臺通知邏輯:

客戶端API

客戶端與服務器通信

  • send() 向遠程服務器發送數據
  • close() 關閉該websocket鏈接

監聽函數 

  • onopen 當網絡連接建立時觸發該事件
  • onerror 當網絡發生錯誤時觸發該事件
  • onclose 當websocket被關閉時觸發該事件
  • onmessage 當websocket接收到服務器發來的消息的時觸發的事件,也是通信中最重要的一個監聽事件。msg.data

readyState屬性

這個屬性可以返回websocket所處的狀態。

  • CONNECTING(0) websocket正嘗試與服務器建立連接
  • OPEN(1) websocket與服務器已經建立連接
  • CLOSING(2) websocket正在關閉與服務器的連接
  • CLOSED(3) websocket已經關閉了與服務器的連接

開源方案

goeasy

GoEasy實時Web推送,支持后臺推送和前臺推送兩種:后臺推送可以選擇Java SDK、 Restful API支持所有開發語言;前臺推送:JS推送。無論選擇哪種方式推送代碼都十分簡單(10分鐘可搞定)。由于它支持websocket 和polling兩種連接方式所以兼顧大多數主流瀏覽器,低版本的IE瀏覽器也是支持的。

地址:http://goeasy.io/

Pushlets

Pushlets 是通過長連接方式實現“推”消息的。推送模式分為:Poll(輪詢)、Pull(拉)。

地址:http://www.pushlets.com/

Pushlet

Pushlet 是一個開源的 Comet 框架,Pushlet 使用了觀察者模型:客戶端發送請求,訂閱感興趣的事件;服務器端為每個客戶端分配一個會話 ID 作為標記,事件源會把新產生的事件以多播的方式發送到訂閱者的事件隊列里。

地址:https://github.com/wjw465150/...

總結

其實前面有提過,盡管WebSocket有諸多優點,但是,如果服務端維護很多長連接也是挺耗費資源的,服務器集群以及覽器或者客戶端兼容性問題,也會帶來了一些不確定性因素。大體了解了一下各大廠的做法,大多數都還是基于輪詢的方式實現的,比如:騰訊PC端微信掃碼登錄、京東商城支付成功通知等等。

有些小伙伴可能會問了,輪詢豈不是會更耗費資源?其實在我看來,有些輪詢是不可能穿透到后端數據庫查詢服務的,比如秒殺,一個緩存標記位就可以判定是否秒殺成功。相對于WS的長連接以及其不確定因素,在秒殺場景下,輪詢還是相對比較合適的。

本文作者:小柒2012

閱讀原文

本文為云棲社區原創內容,未經允許不得轉載。

總結

以上是生活随笔為你收集整理的从构建分布式秒杀系统聊聊WebSocket推送通知的全部內容,希望文章能夠幫你解決所遇到的問題。

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