国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一個JAVA碼農的Node之旅

rollback / 3366人閱讀

摘要:的重連機制會嘗試重連至其他伺服器并重新建立起對應關系。使用進行中文分詞曹操在操場操美女對分詞后的名詞和動詞轉換為簡體中文并查詢命中則替換。返回替換后的字符串得到曹操在操場美女打包部署本身是單線程的雖然本身提供模塊但需要修改代碼。

本篇是一個Node新手做完實際項目后的心得總結。Node高手完全可以略過本文。

摘要

如果BOSS要求你在短期內快速實現一套聊天云服務平臺, 你的第一反應是什么?

讓我細細一想實現成本:

要維護社交關系, 一大波僵尸POJO正在向你襲來。
要存儲數據庫, 找個ORM工具那是必須的。
你怎么也得用長連接吧?好, 那就WebSocket標準吧, Netty或Mina系的親兒子框架選一個唄。什么?!你只用過Tomcat寫WebSocoket?好吧,乖乖翻文檔API去吧親。
完事了?沒呢! 連接斷了你得實現下重連機制吧?服務器端寫完了, 客戶端呢?你得幫助指導下實現吧?
本猿的大腦一片黑暗。

我們的征途是偷懶

如果有現成的輪子偷個懶豈不是很好?google后發現有個socket.io的輪子比較適合:

輕量級, 擴展便捷, API簡單易用。
周邊完善,重連、路由、隔離、單播、廣播等等都已經幫我們實現好了。
豐富的客戶端支持,涵蓋了瀏覽器端, ANDROID, iOS。
在仔細研讀了Flexi傳授如何說服自己的老板采用Node.js,并成功說服BOSS后,本猿正式開始自己的Node之旅。

工欲善其事必先利其器 開發環境

對于開發環境, 青菜蘿卜各有所愛, 無論你是使用神的編輯器/編輯器之神, 或是sublime/atom/npp之流, 亦或是WebStorm高富帥有錢任性, 都是很不錯的選擇。
supervisor是個好東西, 它可以幫你watch代碼變更, 自動重啟服務。節省了手工重啟程序的時間。

關于調試

高富帥款: WebStorm

高逼格款: 原始打斷點

屌絲款: node-inspector, 可以在Chrome中直接調試, 強烈推薦:

離不開的中間件

首先, 勾勒出一個核心的聊天系統大致的雛形:

基本功能

登錄,注銷

在線,離線等狀態維護

好友

加好友,刪好友

好友之間聊天,發文字發圖片發音頻發視頻啥的

群組

創建,加入,退出群組

群組內廣播聊天

聊天歷史記錄 擴展與周邊

集群實現

敏感詞過濾

分析下大致需要的存儲層和中間件以及是否有相關的Node實現:

MySQL: 存儲一些重要的元數據, 主要是用戶關系類的, 需要事務支持。(node-mysql)

ZooKeeper: 用戶在線離線狀態存儲。 (node-zookeeper-client)

Redis: 使用緩存加速一些查詢, PubSub特性用于實現集群通訊。 (ioredis)

HBase: 典型的列式存儲, 用于實現一些非核心數據的快速存儲查詢。 (hbase-rpc-client)

LevelDB: 本地快速讀寫一些鍵值對。(LevelUP)

技術棧 對比

常年滋潤在JAVA這片潤土之上, 先來做個比較, 讓我們對陌生的技術棧有所了解。

圖表鏈接
maven
Vert.x
Hibernate/MyBatis/jOOQ
rxjava
npm
expressjs
socket.io
sequelize
promise

ES6

ES6是個好東西, 我覺得比較好用的三點:

const: 終于可以方便地對不可變的東西進行聲明了。
let: 作為一只 javascript 菜鳥再也不用擔憂不知不覺把變量提升的問題了。
lambda表達式: 神器不解釋。

核心實現 流程時序

仔細思考, 勾勒出大致的時序圖:

時序圖

系統架構:

設計下大致的架構:

架構圖

步步為贏, 各個擊破 狀態管理

典型的 IM 系統中必然存在用戶在線離線的狀態。每一個在線狀態, 對于服務器來說,等價于與客戶端存在一個Socket連接。所以對于單機環境下,在內存中維護用戶和Socket的關系即可,當Socket連接和斷開時分別做更新操作。

當切換至集群環境時,情況變得稍微復雜,所以我們需要借助zookeeper來實現。除了本機每個用戶與Socket關聯關系,另外以臨時節點的方式在zookeeper中進行存儲,目錄結構為根節點/命名空間/用戶標識/Socket標識(臨時節點)。 當socket連接被建立的時候,創建對應的臨時節點,socket斷開時移除臨時節點。 當服務器意外退出時,除了socket連接全部斷開之外,在其zookeeper session上的所有對應的臨時節點也會被銷毀。SocketIO 的重連機制會嘗試重連至其他伺服器并重新建立起對應關系。

優點:

判斷一個用戶是否在線只需判斷用戶標識節點的numChildren是否大于零即可。

獲取用戶所有已連接的Socket只需讀取用戶標識下的所有孩子節點即可。

缺點:

多了額外讀寫zookeeper的開銷。

用途:

實現集群的基礎

有了狀態判定才能實現離線消息推送

好友關系、群組關系

關系表原本存儲于HBase, 但因為缺乏事務支持,實際效果不佳, 經常導致關系不一致。傳統關系型數據庫在這一方面依舊強勢。這塊比較簡單,即常見的關系模型表,在此略過。

點對點聊天實現 單機

A對B發送消息,除了基礎的權限判定,只需查詢內存表中對應B的所有socket,然后對其發射消息即可。見下圖:

集群

由于B可能登錄在不同的服務器上,需要借助消息中間件(Redis Pub/Sub),發布消息,每個服務器訂閱消息列表,如果存在消息接收者,則找到其注冊在本機的socket進行發射消息。流程如下圖:

廣播聊天實現

廣播類似以上的點對點實現,只是多了一步查詢成員表依次處理的步驟。略過。

聊天歷史記錄的實現

考慮到只需要根據時間范圍做分頁查詢的簡單需求,這里使用了 HBase 的寬表。 點對點形式的聊天我們可以對兩個用戶標識進行排序,并結合命名空間生成唯一的哈希值,作為行健,而每個CELL的值則是時間戳, 因為我們需要令其自然倒序排列, 所以針對時間戳做了LONG.MAX-時間戳的處理。綜合起來, 大致的存儲結構如下:

敏感詞過濾

維護臟詞字典,對消息進行字符串替換?圖樣圖森破!!! 為了實現正確辨認“曹操在操場操美女”中的動詞“操”,需要實現中文分詞和詞性判斷, 于是處理邏輯轉變成:

拉取最新的臟詞列表,轉換為簡體中文并寫入LevelDB中。

使用nodejieba進行中文分詞: 曹操(n)/在(p)/操場(n)/操(v)/美女(n)

對分詞后的名詞和動詞轉換為簡體中文并查詢LevelDB,命中則替換。

返回替換后的字符串得到:曹操在操場*美女

打包部署 PM2

Node本身是單線程的,雖然Node本身提供Cluster模塊,但需要修改代碼。通過PM2這個工具可以簡便地讓其多進程部署,充分利用多核CPU資源:

pm2

Docker
可以使用官方的node鏡像。但體積比較大,這里推薦基于alpine-node, 體積比較小巧, 例如:

FROM mhart/alpine-node:4

RUN apk add --no-cache make gcc g++ python

RUN apk add --no-cache imagemagick

WORKDIR /src
ADD . .
RUN npm install --registry=http://registry.npm.taobao.org/

EXPOSE 3000
CMD ["npm","start"]
C1000K測試

著名的單機100萬連接, 由于項目是第一個版本, 限于各方面原因我們暫時沒有完成這個測試。

但在這里簡短介紹所需的一些配置, 以備后續使用:

服務器端

修改tcp連接的最小內存為4k, 編輯/etc/sysctl.conf

net.ipv4.tcp_wmem = 4096 87380 4161536
net.ipv4.tcp_rmem = 4096 87380 4161536
net.ipv4.tcp_mem = 786432 2097152 3145728

修改系統最大文件描述符, 編輯/etc/sysctl.conf

fs.file-max = 1000000

修改進程最大文件描述符, 編輯/etc/security/limits.conf

重載下配置(sysctl -p)或者重啟,檢查下當前的設置 cat /proc/sys/fs/file-nr

客戶端

因為每個IP最多可以創建6萬多個連接,不可能找很多服務器進行測試。所以客戶端除了上述修改,還需要創建多個虛擬IP,這樣每個IP可以提供大約6萬的連接,如:

ifconfig eth0:0 192.168.77.10 netmask 255.255.255.0 up
ifconfig eth0:1 192.168.77.11 netmask 255.255.255.0 up
ifconfig eth0:2 192.168.77.12 netmask 255.255.255.0 up
ifconfig eth0:3 192.168.77.13 netmask 255.255.255.0 up
ifconfig eth0:4 192.168.77.14 netmask 255.255.255.0 up
ifconfig eth0:5 192.168.77.15 netmask 255.255.255.0 up
ifconfig eth0:6 192.168.77.16 netmask 255.255.255.0 up
ifconfig eth0:7 192.168.77.17 netmask 255.255.255.0 up
ifconfig eth0:8 192.168.77.18 netmask 255.255.255.0 up
ifconfig eth0:9 192.168.77.19 netmask 255.255.255.0 up
ifconfig eth0:10 192.168.77.20 netmask 255.255.255.0 up
ifconfig eth0:11 192.168.77.21 netmask 255.255.255.0 up
ifconfig eth0:12 192.168.77.22 netmask 255.255.255.0 up
ifconfig eth0:13 192.168.77.23 netmask 255.255.255.0 up
ifconfig eth0:14 192.168.77.24 netmask 255.255.255.0 up
ifconfig eth0:15 192.168.77.25 netmask 255.255.255.0 up
ifconfig eth0:16 192.168.77.26 netmask 255.255.255.0 up
ifconfig eth0:17 192.168.77.27 netmask 255.255.255.0 up
ifconfig eth0:18 192.168.77.28 netmask 255.255.255.0 up

修改本地端口范圍,編輯/etc/sysctl.conf

net.ipv4.ip_local_port_range = 1024 65535

重載配置或重啟開始測試

總結

存在即合理,不要卷入無謂的語言之爭,本猿覺得干這行的最重要莫過于學習能力。

寫代碼之前先理清楚思路和結構,不打沒有準備的仗。

良好的代碼規范,遵循KISS原則。

本文作者來自 MaxLeap 團隊_數據分析組 成員:蔡偉偉

原文鏈接

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/65719.html

相關文章

  • 微服務橫行的今天, 你的文檔跟上節奏了么?

    摘要:納尼隔壁少林派表示自家金剛技壓群雄在座各位都是。。。納尼你覺得寫太繁瑣了你不喜歡我們還有或者等等一大堆工具呢。納尼沒有你還是覺得無法接受好吧那么筆者推薦類似這類更友好的工具你可以導入導出其他格式也可以使用其來撰寫。 說起微服務, 想必現在的技術圈內人士個個都能談笑風云, 娓娓道來。的確, 技術變革日新月異, 各種工具框架雨后春筍般涌現, 現在我們可以輕巧便捷地根據自己的業務需求, 構建...

    liaoyg8023 評論0 收藏0
  • 農的黑客反擊戰(三)

    摘要:前言最近服務器被黑客做了肉雞,前后已經折騰了兩次碼農的黑客反擊戰,碼農的黑客反擊戰二,查殺病毒文件,修改服務器默認配置,經過觀察發現,依然沒有完全清除干凈。至此,只能宣布黑客反擊戰其實算不上反擊,只是修復失敗。 前言 最近服務器被黑客做了肉雞,前后已經折騰了兩次(碼農的黑客反擊戰,碼農的黑客反擊戰(二)),查殺病毒文件,修改服務器默認配置,經過觀察發現,依然沒有完全清除干凈。具體表現為...

    zhangyucha0 評論0 收藏0
  • 我是一個碼農

    摘要:我是一個碼農什么是碼農百度百科的定義是一般指從事軟件開發職位的職員,學不到新技術,同時也是部分從事軟件開發工作人員的一個自嘲的稱號。我是一個家有果園的老碼農。應該做一個寫寫代碼,賣賣水果,也打理自己果園的碼農了。 我是一個碼農 showImg(/img/bVEenN?w=550&h=306); 什么是碼農?百度百科的定義是:一般指從事軟件開發職位的職員,學不到新技術,同時也是部分從事軟...

    darkbug 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<