精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

京東到家基于Netty與WebSocket的實踐

開源
在京東到家商家中心系統中,商家提出了要在 Web 端實現自動打印的需求,不再需要人工盯守點擊打印,直接打印小票,以節約人工成本。

在京東到家商家中心系統中,商家提出了要在 Web 端實現自動打印的需求,不再需要人工盯守點擊打印,直接打印小票,以節約人工成本。

解決思路

關于問題的兩種思考邏輯:

  • 可以用 ajax 來輪詢服務端獲取最新訂單,也就是 pull。
  • 可以用類似推送的設計來實現,也就是 push。

我們評估了兩種思路的優缺點:

  • ajax 方式實現簡單,只需要定時從服務端 pull 數據即可,但也增加了很多次無效的輪詢,即無形中增加服務端無效查詢。
  • push 方式實現稍復雜,需要服務端與 PC 端保持連接,這就需要建立長連接,最終通過長連接的方式來實現 push 效果。

經過討論,我們選擇了第二種,訂單中心生產出的新訂單,通過 MQ 的方式推送給 Web 端,最終獲得一個比較好的用戶體驗。

方案介紹

關于長連接方案的選擇,我們參考了不少帖子,最終選擇了使用 websocket 協議來實現長連接,類似場景如 IM,服務端即時推送等都使用了這個協議。

接下來我們比較一下 websocket 的框架,比較主流的有 netty、tomcat、socketIO 三個框架:

  • 基于支持 websocket 的容器,開發簡單,例如 tomcat,但在高并發的支持不是很好,連接的時候容易連接斷開,還有就是依賴容器。
  • netty-socketIO 是在 netty4 基礎之上做了一層封裝,效率如同 netty 一樣,是一個全平臺方案,友好的 API。京東的 logbook 也是用了 socketIO 來傳遞日志,也是我們的一個備選方案。
  • netty 是業內主流的 NIO 框架,netty 對 Java NIO 做了封裝,讓開發者更多關注業務,降低開發成本。

很多著名的 RPC 框架都采用了 netty 作為傳輸層,友好的 API,功能強大,內置了很多編解碼協議,實現 websocket 協議也是十分方便。

那我們橫向比較一下這些框架:

所以在選型方面我們還是定位在 socketIO 與 netty 上面,在兼顧擴展性與靈活性的同時,我們也考慮到 netty 可以提供 http 的功能。

最終我們選擇了使用 netty,當然 socketIO 封裝了很多功能,也是十分強大,相比較來說 netty 更適合我們,比較輕量。

Netty 的特性

netty 具有異步非阻塞的特性,傳統 IO 是面向流的,NIO 是面向緩沖區的,這也是它的非阻塞原因所在。

netty 的線程模型如圖所示:

這種模型就是我們常說的 Reactor 模型,boss 線程其實是一個獨立的 NIO 線程池,用于接收 client 請求,默認線程池大小為 1,worker 線程池用于處理具體的讀寫操作,默認線程池大小為 2*cpu 個數。

在上述模型中要特別注意 ExecutionHandler,ExecutionHandler 是運行在 worker 線程中的,所以耗時的操作最好在線程池中運行, 比如 IO 或者計算,不然會影響整個 netty 的吞吐。

了解了這些,我們根據自己的業務設計出流程,如下圖所示:

  • 步驟 1:Web 端請求服務端進行注冊,注冊成功保持長連接。
  • 步驟 2:服務端發送 MQ。
  • 步驟 3:netty 將收到的消息推送給 Web 端。
  • 步驟 4:Web 端調用打印控件進行打印,打印控件需提前安裝好(打印控件是 PC 上安裝的一個驅動程序,用過 JS 方式來調用)。

如果調用 JS 成功,控件將把打印信息放入打印隊列,如果不成功,重復步驟 4。

當然現在的結構只是單機版,不滿足生產條件,那將來的結構可能會演變成如下圖所示:

我們會在服務端與 netty 之間建立路由層,路由層的主要職責有:

  • 收集集群存活信息
  • 記錄落點,就是落在哪一臺機器上面
  • 接收消息與分發消息

有了這三種能力,我們就可以輕松的指定信息分發策略。我們希望使用 http 協議來路由,這就需要 netty 有 http 短連接接收的能力 ,所以 netty 整體上需要長短連接兩種能力。

下面是部分代碼:

netty 啟動類,我們通過 spring 來啟動 netty,因為 netty 啟動會阻塞主線程,所以需要在子線程中來啟動 netty,下面是啟動參數。

接著來寫我們的 ChannelInitializer,HttpServerCodec 為編解碼器,WSServerProtocolHandler 為 websocket 協議握手。

我們更關注業務層面自定義的兩個 hander,httpRequestHandler,authorizeHandler。

httpRequestHandler 的作用是處理 URL 是否合法,接收參數。

httpRequestHandler 此方法中也可以根據 URL 來過濾,自定義自己的短連接請求。

authorizeHandler 的作用是校驗數據是否正確,如果正確會將 channel 保存到 map 中,通過 map 建立起業務 ID 與通道之間的關系。

校驗的過程我們在 authorizeHandler 中的 channelRead 展開,如果未通過,直接關閉當前 channel。

如果通過校驗,則通過 ctx.fireChannelRead(msg);方法將信息傳入下一個 handler 去處理。

在項目里主要是以傳遞參數來進行數據校驗的,也就是通過 URL 傳參來實現。

在 httpRequestHandler 中我們將 URL 參數 set 到 channel 的 attr 中,并傳遞給了下一個 handler,也就是 authorizeHandler。

所以在 authorize 方法中我們可以利用 get() 方法得到參數值,u 是經過加密的數據,我們需要在這里進行解密,解密失敗,可認為校驗失敗。

當然如果有跨應用的服務,也可以通過 Cookie 的方式來進行加密串的讀寫,通過 request.getHeader 是可以獲取 Cookie 中的信息,這就看具體業務了。

示例代碼如下:

這個 map 可以理解為 servlet 中的 session,當有信息需要傳送給某個客戶端時,我們調用 map.get(key) 方式到當前該客戶端的 channel,調用 writeAndFlush 方法將信息發送出去,下面舉例通過接收 MQ 消息后的處理邏輯。

接下來有人可能想到,如果通道關閉了怎么辦?map 中的 channel 是不是就失效了呢?

其實我們還需要有一個類似心跳的機制去維護 channel,間接的去維護這個 map。

如果是通道正常關閉,可以通過 channelInactive 方法來監聽。

如果是長時間空閑,在項目中我們使用了增加的 IdleStateHandler 來處理,通過覆蓋 userEventTriggered 方法來監聽空閑 channel,當某個 channel 到達我們設置的超時時間時,netty 會回調此方法。

至此,核心部分已經處理完成,剩下的就是通過保存的 channel 來發送信息給客戶端了。

最后在 Web 端,我們采用了 reconnecting-websocket,它是一個小型的 JavaScript 庫,封裝了 WebSocket API, 提供了在連接斷開時自動重連的機制,能夠幫助我們完成斷開重連的操作。

遇到的問題

經過測試,在 ws 的 uri 后面不能傳遞參數,不然在 netty 實現 websocket 協議握手的時候會出現斷開連接的情況。

針對這種情況在 websocketHandler 之前做了一層 httpHander 過濾,將傳遞參數放入 channel 的 attr 中,然后重寫 request 的 uri,并傳入下一個管道中,基本上解決了這個問題。

在讀寫空閑的時候盡量以發心跳包的方式維護連接,但在客戶端由于網絡不穩定或者是服務端重啟,連接會斷開,瞬間有可能接收不到訂單消息,為此在客戶端需要實現斷開重連機制。

此問題我們采用 reconnecting-websocket的 JS 框架,此框架擴展了原生 websocket 的實現,做了斷開重連機制,有效的防止斷開后不能及時連接。

在測試過程中由于控件與小票機的問題,可能會出現打印異常或者小票機沒紙的情況。Lodop 控件可以將打印信息放入電腦的打印隊列。

如果沒紙了,小票機會報警,再次放入小票紙,打印機會自動打印隊列中的數據。

出現調用控件異常偶爾發生,現在處理辦法是在 JS 中進行了的 try catch。

如果失敗,進行重試,重試次數自定義,超過重試次數暫不做處理,此處還不太嚴謹,需要再進行優化。

總結

通過上面的實踐,我們基本已經實現了 Web 端的自動打印,經過長時間的內部測試,服務端與客戶端通信穩定,我們將灰度商家做用戶體驗。

在特定的場景下,選擇適當的技術會提高我們的效率,否則會適得其反。

選擇長連接,大家可以把握這三個大原則:

  • 服務端是否需要主動推送數據到客戶端以實現控制的效果。
  • 對于實時性的要求是否苛刻。
  • 對于客戶端是否需要關注它在線狀態的實時變化。

責任編輯:武曉燕 來源: 達達京東到家
相關推薦

2018-11-06 14:05:27

京東訂單派發架構

2019-08-30 12:30:25

京東到家訂單查詢數據存儲

2018-12-20 06:04:02

京東到家訂單中心Elasticsear

2017-12-12 08:40:00

2019-01-14 09:06:40

LBS定位系統架構

2019-01-17 09:50:55

京東ES架構

2022-02-12 20:51:23

京東程序員代碼

2019-01-02 14:55:54

MySQLES數據庫

2024-08-02 09:00:17

NettyWebSocketNIO

2022-02-14 08:13:33

刪庫MySQL備份

2021-03-18 14:34:34

達達集團京東云電商

2021-11-24 08:55:38

代理網關Netty

2024-10-15 08:14:51

2022-06-30 09:30:36

FlinkSQL流批一體京東

2022-02-11 15:01:07

程序員刪庫計算機

2016-08-05 13:19:29

GET請求github項目 POST請求

2021-02-05 07:28:11

SpringbootNettyWebsocke

2021-12-08 10:35:04

開源監控Zabbix

2019-11-01 15:50:06

MySQLES搜索引擎

2021-08-09 09:48:16

NettyChannelHand架構
點贊
收藏

51CTO技術棧公眾號

亚洲国产精品人久久电影| 亚洲日本一区二区三区| 国产97在线|亚洲| 欧美福利第一页| 国产精品1区在线| 亚洲丰满少妇videoshd| 欧美午夜视频在线| av 一区二区三区| 另类激情亚洲| 久久不射热爱视频精品| 亚洲精品乱码久久久久久久| jk漫画禁漫成人入口| 国产精品国产自产拍高清av王其| 成人女人免费毛片| 国产偷人爽久久久久久老妇app| 欧美xxx在线观看| 亚洲欧美激情视频| 先锋资源在线视频| 欧美亚洲综合视频| 欧美午夜精品伦理| 成年人深夜视频| 香蕉视频免费在线播放| 成人动漫视频在线| 亚洲一区二区三区在线免费观看| 无码人妻精品一区二区| 精品999日本| www.xxxx欧美| 亚洲一区 欧美| 美女视频亚洲色图| 欧美变态口味重另类| 中文字幕在线综合| 亚洲最大网站| 天天影视网天天综合色在线播放| 精品一区二区成人免费视频| 精品乱码一区二区三四区视频| 国产二区国产一区在线观看| 国产精品网址在线| 亚洲成人av影片| 日韩视频中文| 欧美激情综合色综合啪啪五月| www.黄色com| 国产精品三级| 亚洲精品影视在线观看| 亚洲最大视频网| av成人亚洲| 日本乱人伦一区| 久久久久久久激情| 涩涩av在线| 欧美日韩国产综合视频在线观看中文 | 亚洲一区二区三区色| 天堂av网在线| 久久综合国产精品| 日本精品一区二区三区不卡无字幕| 欧美一级淫片aaaaaa| 国产 日韩 欧美大片| 亚洲xxx自由成熟| 99国产精品99| 国产精品18久久久久久久久| 91精品视频观看| 国产精品毛片一区视频播 | www.四虎精品| 国产极品模特精品一二| 欧美精品一区二区在线观看| 日韩欧美理论片| 欧美片网站免费| 精品国产91九色蝌蚪| 成年人小视频在线观看| 欧美男男freegayvideosroom| 日韩欧美一区二区免费| 国内精品免费视频| 免费观看不卡av| 中文字幕日本欧美| 一区二区视频免费看| 欧美亚韩一区| 欧洲亚洲在线视频| 中文字幕第2页| 国产福利一区在线| 九九九九九九精品| jizz亚洲| 亚洲午夜免费电影| 黄色片一级视频| 在线视频成人| 亚洲丁香久久久| 特级西西www444人体聚色 | 久色乳综合思思在线视频| 久久中文字幕无码| 天堂va蜜桃一区二区三区漫画版| 国产精品爽爽爽| 亚洲经典一区二区| 国产欧美日韩激情| 国产欧美日韩小视频| 成人小电影网站| 欧美一区二区视频观看视频| 亚洲中文字幕一区| 国产精品久久久久久久免费观看| 久久久久女教师免费一区| 精品久久久久久久久久久国产字幕| 久久99精品国产麻豆婷婷 | 欧美先锋资源| 欧美激情亚洲国产| 波多野结衣在线观看视频| 国产裸体歌舞团一区二区| 久久婷婷人人澡人人喊人人爽| www黄在线观看| 香蕉加勒比综合久久| 一道本在线免费视频| 欧美freesex8一10精品| 日韩视频免费在线观看| 中文字幕激情小说| 国产99精品视频| 亚洲欧洲免费无码| 日本午夜大片a在线观看| 欧美一区二区在线免费播放| 91激情视频在线观看| 亚洲美女黄色| 亚洲最大福利视频| 99视频在线观看地址| 婷婷一区二区三区| 性一交一黄一片| 欧美超碰在线| 国产成人精品优优av| 日本黄色一区二区三区| 亚洲欧美激情插 | 全球最大av网站久久| 日韩成人激情视频| 国产一级在线观看视频| 国产中文一区二区三区| 天堂资源在线亚洲资源| 69久成人做爰电影| 国产丝袜一区二区| 在线观看黄网站| youjizz国产精品| 女人帮男人橹视频播放| 亚洲开心激情| 九九九久久国产免费| 国产美女精品视频国产| 国产精品毛片a∨一区二区三区| 久久黄色免费看| 色天下一区二区三区| 性色av一区二区三区| 蜜桃久久一区二区三区| 亚洲第一精品在线| 91九色蝌蚪porny| 亚洲激情黄色| 国内精品久久久久久久果冻传媒| 日本在线观看大片免费视频| 日韩西西人体444www| 欧美成人精品欧美一级| 国产成人免费av在线| 日本人妻伦在线中文字幕| 欧美日韩黄网站| 欧美精品在线第一页| 国产高清在线观看视频| 一区二区日韩电影| 91精品又粗又猛又爽| 在线精品在线| 久久涩涩网站| avav成人| 欧美成人高清视频| 狠狠综合久久av一区二区| 亚洲一区二区成人在线观看| 久久人妻少妇嫩草av无码专区 | 超碰免费在线97| 亚洲午夜一区二区三区| 在线观看国产免费视频| 日韩黄色免费网站| 夜夜爽www精品| 精品一区二区三区视频在线播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲成人黄色片| 欧美日韩国产一区二区| 婷婷综合在线视频| 国产福利精品导航| 国产日韩一区二区在线| 日韩精品二区| 成人自拍偷拍| **在线精品| 久久影院模特热| 欧美熟女一区二区| 欧美视频一区二区在线观看| 久久中文免费视频| 91女厕偷拍女厕偷拍高清| 成人亚洲视频在线观看| 亚洲视频在线免费| 久久久人人爽| 国产精品久一| 全球成人中文在线| 黄色的网站在线观看| 亚洲国产美女久久久久| 中文字幕 欧美激情| 亚洲成人一区在线| 99在线视频免费| 高清视频一区二区| 久久久精品麻豆| 亚洲久久视频| 色撸撸在线观看| 一区二区三区四区在线看| 亚洲va久久久噜噜噜| 亚洲精品一区| 欧美高清videos高潮hd| 国产天堂在线| 亚洲国产成人久久综合| 亚洲天堂网在线观看视频| 香蕉乱码成人久久天堂爱免费| 精品国产国产综合精品| 久久久久国产精品人| 下面一进一出好爽视频| 日本欧美韩国一区三区| 日韩精品 欧美| 亚洲电影在线一区二区三区| 欧美亚洲一级二级| 国产精品久av福利在线观看| 国产一区玩具在线观看| 二区三区不卡| 97国产suv精品一区二区62| 欧美日韩欧美| 中文字幕欧美日韩精品| 神马电影在线观看| 欧美精品一区二区三| 国产片高清在线观看| 欧美视频中文字幕| 免费av网站在线| 亚洲高清免费视频| 欧美黑吊大战白妞| 中文字幕一区二区三中文字幕| 美女脱光内衣内裤| 91视频免费观看| 精品国产一区在线| 成人免费三级在线| 一级全黄裸体片| 国产黄人亚洲片| 91香蕉视频免费看| 极品少妇一区二区三区精品视频| 日韩一级免费在线观看| 免费视频一区| 男人揉女人奶房视频60分| 亚洲精品偷拍| 国产精品久久久久久久乖乖| 欧美日韩国产探花| 黄网站色视频免费观看| 女生裸体视频一区二区三区| 国产精品一区在线免费观看| 亚洲91视频| 久久久久久久久影视| 久久久人成影片免费观看| 香蕉视频免费版| 欧美freesex交免费视频| 日本福利视频网站| 欧美性久久久| 免费成人午夜视频| 亚洲免费网站| 亚洲视频在线观看一区二区三区| 天堂av在线一区| 在线观看国产福利| 韩国理伦片一区二区三区在线播放| 九色porny自拍| 国产精品一二一区| 男人网站在线观看| 91啪九色porn原创视频在线观看| 中文字幕在线1| 国产精品久久毛片| 成年人二级毛片| 亚洲一线二线三线视频| 久久99精品波多结衣一区| 色哟哟一区二区在线观看| 69av视频在线观看| 91麻豆精品国产91久久久久久| 精品免费久久久| 亚洲国产精品电影| 九色视频在线播放| www日韩欧美| 日本高清成人vr专区| 4k岛国日韩精品**专区| 日韩精品三区| 96pao国产成视频永久免费| 美女国产精品久久久| 精品1区2区| 日本不卡电影| 欧美性潮喷xxxxx免费视频看| 国产精品腿扒开做爽爽爽挤奶网站| 免费在线观看的毛片| 国产一区在线不卡| 美女又爽又黄视频毛茸茸| 中文字幕高清不卡| 久久9999久久免费精品国产| 一本色道久久加勒比精品 | 亚洲精品中文字| 在线播放毛片| 97人人爽人人喊人人模波多 | 国产传媒在线播放| 97超碰国产精品女人人人爽| 99久久er| 国产一区国产精品| 99久久久久国产精品| 国产精品无码人妻一区二区在线| 蜜臀久久99精品久久久久宅男| 久久久高清视频| 中文字幕亚洲在| 中文字幕高清在线免费播放| 日韩精品最新网址| 一级毛片视频在线| 欧美性受xxx| 亚洲一区二区三区日本久久九| 日韩欧美在线观看强乱免费| 韩国av一区| 国产女同无遮挡互慰高潮91| 久久美女艺术照精彩视频福利播放| 亚洲av鲁丝一区二区三区| 91国偷自产一区二区开放时间| 亚洲第一精品网站| 久久视频在线看| 国产成人免费| 欧美大香线蕉线伊人久久国产精品| 欧美精品一卡| 天天操狠狠操夜夜操| 久久久精品免费免费| 久久免费黄色网址| 91精品蜜臀在线一区尤物| 国产黄色片在线观看| 91精品91久久久久久| 91在线一区| 女人床在线观看| 韩国精品免费视频| 伊人久久久久久久久久久久久久| 欧洲日韩一区二区三区| 四虎精品成人影院观看地址| 欧美激情图片区| 99这里只有精品视频| 九一免费在线观看| 国产在线精品一区二区不卡了 | 人成在线免费视频| 97婷婷涩涩精品一区| 爱爱精品视频| 精品国产一区二区三区无码| 狠狠色综合播放一区二区| 久久精品色妇熟妇丰满人妻| 欧洲一区在线电影| 91sp网站在线观看入口| 国产97在线视频| 精品视频日韩| 手机在线看福利| 中文字幕精品三区| 一区二区三区免费在线视频| www日韩中文字幕在线看| 国产精品视频一区二区三区| 男人的天堂成人| 国产精品伊人色| 久久久久无码国产精品| 精品国产百合女同互慰| aa国产成人| 久久av免费一区| 久久久www| 成人在线手机视频| 欧美精品丝袜中出| av网站导航在线观看免费| 91精品黄色| 亚洲理伦在线| 久操视频免费看| 欧美日韩1区2区| 色呦呦视频在线观看| 国产精品青青草| 奶水喷射视频一区| 黄色国产在线播放| 欧美一区二区三区思思人| 91资源在线观看| 欧美一区二区在线| 激情综合亚洲精品| 久久综合色综合| 亚洲欧美日韩视频一区| 成人精品一区二区三区电影| 在线观看视频黄色| 91亚洲精品久久久蜜桃网站| 99re这里只有精品在线| 久久精品国产亚洲精品| 99久久香蕉| 亚洲欧美另类动漫| 亚洲人成网站影音先锋播放| 色婷婷视频在线| 国产美女扒开尿口久久久| 午夜影院欧美| 狠狠人妻久久久久久综合蜜桃| 欧美午夜影院一区| 国产嫩草在线视频| 日韩中文字幕一区| 国产99久久久久| 欧美一级黄视频| 欧美激情欧美狂野欧美精品| 深爱激情综合| 日本中文字幕精品| 在线观看成人小视频| 久草在线新免费首页资源站| 欧美日韩在线观看一区二区三区| 国内精品伊人久久久久av影院| www.日本精品| 久久久久99精品久久久久| 亚洲区小说区图片区qvod按摩| 永久免费黄色片| 91高清视频免费看| 国产在线拍揄自揄拍视频 | b站大片免费直播|