2009-10-01 30 views
0

我有個問題如下:網絡編程抽象,分解

服務器進程1

  • 不斷髮送發生到數據存儲

服務器進程2

    更新
  • 客戶端聯繫查詢數據存儲的服務器,並返回結果

事情是,進程1和進程2發回客戶端的結果是完全不同和無關的。

這是怎麼分解的? 你只是有一個進程不斷地發送數據,並且定義協議有一點對應於返回類型是1還是2?

你有兩個過程嗎?他們如何共享數據存儲(它只是一個結構而不是數據庫)?

謝謝!

回答

1

聽起來好像你想要將你的一系列ints串流到「某處」,並將它們收集到數據存儲中。在我的系統中,我將傳感器讀數傳輸到數據庫,並允許他們直接訪問網絡客戶端,爲他們提供實時讀數。我寫了一篇關於爲什麼database is not suitable for live data的博客文章 - 儘管它非常適合保存數據以供日後分析。

我想要第一個服務器進程是一個扭曲的服務器,它使用txamp將整數傳輸到RabbitMQ。任何需要實時數據的客戶端都可以使用Txamp在RabbitMQ中訂閱流。 Web瀏覽器客戶端可以使用Orbitedhere is a worked example

在您的設計服務器1中保存到數據庫。您可以讓server3從RabbitMQ收集數據並將其傳輸到數據庫。我計劃有一臺服務器收集大量數據並呈現圖形以存儲到中央文件共享中。

不要創建自己的消息系統,RabbitMQ經過良好測試,可擴展,並且如果出現問題,可以保留「消息」(原始數據)。

+0

這就是我最初想到的,但沒有健壯的STOMP客戶端在iPhone上本機運行。 – DevDevDev 2009-10-01 23:34:03

+0

如果你在iphone上本地工作,則不需要STOMP庫,然後你想要的是C++ AMQP客戶端庫,就像txAMP是一個python庫一樣。做一些谷歌搜索找到你喜歡的一個。 – 2009-10-02 00:45:37

0

爲什麼不使用數據庫而不是「只是一個結構」?關係數據庫和非關係數據庫都提供了許多實用優勢(使用它們的單獨進程,照顧複製[[和/或快照,備份,...]],豐富的功能(如果您需要「查詢」的話)等等)。

最糟糕的情況是,「只是一個結構」可以由完全專用於它的第三個進程來處理(基本上模仿任何數據庫引擎提供的內容 - 雖然引擎可能做得更好更快);-),允許您至少保持良好的分解(兩個服務器進程都與「數據存儲進程」交互)。

+0

我希望沒有人會因爲我說的「數據存儲」而陷入困境。數據庫非常不適合這個應用程序。把它看作一個整數數組,他們正在改變,服務器必須發出他們的改變,用戶可以要求對數組進行一些複雜的計算。 – DevDevDev 2009-10-01 20:30:13

+0

@ Dev' *'3,無論如何 - 我仍然建議您將關注和餵養該商店的流程投入到流程中(因此也會內在地序列化訪問流程,這是一個安全的選擇 - 如果您需要重複訪問,有趣的實現範圍鎖定,R vs W和多線程數據存儲過程;-)。 – 2009-10-01 21:01:39

1

如果你能限制自己Twisted,我推薦使用Perspective Broker。它本質上是一個RPC系統,並不關心「客戶端」和「服務器」的概念 - 或者是TCP連接的發起者,或者是響應者可以在PB中啓動RPC調用。

因此,服務器1將接受具有回調對象的註冊調用,並在有新數據可用時調用回調。服務器2根據客戶需要提供各種RPC操作。如果他們對相同的數據進行操作,我會將兩臺服務器放在一個進程中。

+0

並將數據存儲爲全過程全局變量?這或多或少是我現在正在使用Twisted的道路。你能指點我一個在網絡上使用回調的例子嗎?那麼,客戶端是否也必須充當RPC服務器呢? 現在我正在做你剛纔所說的,除了客戶端有兩個線程,一個只是從服務器1接收數據時阻塞,而另一個是可以向服務器2發送RPC調用。 – DevDevDev 2009-10-01 22:04:35

+0

我只能在服務器上使用Twisted方,這是否限制我使用直接的TCP? – DevDevDev 2009-10-01 22:40:38

+0

@DevDevDev:要獲得一個現實世界的PB示例,請查看buildbot(buildbot.net)。構建從站登錄到主站;那麼RPC通過單個TCP連接進行雙向(允許調用位於防火牆或NAT後面的從站)。如果客戶端不是用Python編寫的,則必須通過TCP來推出自己的RPC協議。我建議使用TLV編碼。 – 2009-10-02 14:52:40