我正在研究構建一個服務在後臺運行,允許客戶端連接併發送命令,並獲取數據。我打算在Ruby中編寫服務(作爲寶石),但想知道允許客戶端連接到API的最佳方法是什麼?在Ruby中構建一個其他進程可以通過套接字進行交互的linux服務?
我認爲套接字連接是有意義的,就像你連接Redis或其他東西一樣,但我不確定從哪裏開始!
任何提示將不勝感激:)
我正在研究構建一個服務在後臺運行,允許客戶端連接併發送命令,並獲取數據。我打算在Ruby中編寫服務(作爲寶石),但想知道允許客戶端連接到API的最佳方法是什麼?在Ruby中構建一個其他進程可以通過套接字進行交互的linux服務?
我認爲套接字連接是有意義的,就像你連接Redis或其他東西一樣,但我不確定從哪裏開始!
任何提示將不勝感激:)
是的,你在正確的道路上。套接字只是一個允許兩個程序交換字節的雙向通信通道。如果兩個端點在同一臺計算機上,則UNIX套接字是明顯的選擇;否則,您將需要一個TCP套接字通過網絡進行通信。兩種情況下的原理都是一樣的。
在套接字之上,您必須定義自己的協議,或者如果它適用於您的情況,您可以使用現有的協議(如HTTP)。
既然你問任何提示,我給你的建議是,建立一個服務容器是艱苦的工作。既然你實際上並不需要,那裏已經有很多很棒的服務容器,你應該使用其中的一個。
我會建議背後HTTP的東西,它給你一大堆圍繞現有的工具,消息框,內容協商的優勢,縮放你的服務,並部署和升級車型。
如果你想避免外部依賴,使用類似的WEBrick或Mongel是純Ruby是一個很好的方式,以避免需要包裹Apache或Nginx的在你的系統中。
這也使您能夠分離出項目中的關注點:首先構建實際的服務層,處理命令並返回響應。在任何Web服務器下運行該程序,然後繼續。
然後,當你有時間,分別專注於如何構建服務容器,以滿足您的需求:因爲你知道,基礎服務層工作正常,你可以專注於只解決了容器的問題。
如果你確實想構建自己的容器,我強烈建議你使用比套接字更高級別的東西。諸如0mq之類的工具提供了不能從套接字獲得的成幀和其他消息層功能,並且更容易專注於定義問題空間中有趣的部分 - 命令 - 而不是像分析有線格式那樣的低級細節和協議。
系統的基本概念是,該服務將生成增量且唯一的ID(跨分片系統),供Web應用程序根據請求使用。我需要它儘可能快,所以HTTP看起來像是過度殺毒,因爲客戶端總是會在同一臺機器上。 – tarnfeld 2012-03-08 22:15:51
這對增加問題會有幫助。 :)你應該只使用雪花:https://github.com/twitter/snowflake – 2012-03-08 22:16:52
我一直在和那裏的人聊天,並且在邊界/片狀 - 但是,我使用ID作爲簡短的URLs,所以對我來說(除了唯一性)ID需要很小,並隨着時間的推移而增長。雪花將永遠適合64位(或片狀,128位),並將始終是長號碼。那不是我想要的。 :( – tarnfeld 2012-03-08 22:20:09
我在EC2服務器(Amazon Web Services AWS)的後臺運行Redis時使用了Ruby/Rails應用程序。這是Ubuntu的構建,我發現最容易一起工作:
Linux version 2.6.32-341-ec2 ([email protected]) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)) #42-Ubuntu SMP Tue Dec 6 14:56:13 UTC 2011
在,做最輪詢我的主要.RB文件/搜索我已要求這RubyGems的,你一定要檢查出來:
require 'aws'
require 'redis'
require 'timeout'
require 'json'
讓我知道你是專門試圖做什麼,如果這不足以幫助你。祝你好運!
謝謝!雖然這個想法是服務在客戶端連接並請求一些數據之前並沒有做太多的工作。 – tarnfeld 2012-03-08 22:23:04
過去我已經用EventMachine構建了一對守護進程。它高效強大,支持TCP,HTTP和其他一切。人們甚至在其上寫上web servers。
其基本思想是服務將爲客戶端生成ID,這就是它。有一些東西需要服務來處理唯一的ID等,但就通信層而言,需要一個ID(也許獲得一些狀態信息)並獲取一些數據,這很簡單。有點像Redis的溝通工作。 – tarnfeld 2012-03-08 22:17:08