當用戶登錄到我的網站時,我想打開與另一臺服務器的連接。用戶對我的服務器的請求會轉化爲對該服務器的讀/寫請求。只要用戶登錄,與該服務器的連接對象應該處於活動狀態,這樣我就不需要重新連接每個用戶請求。Ruby on Rails:如何讓對象在許多請求中保持活動狀態?
據我瞭解軌道上的ruby,一旦請求完成,控制器/幫助器中的所有對象都會被清除。我需要保持該對象在多個請求中保持活動狀態,直到用戶註銷。
架構方面,在RoR框架中可以放置這樣的對象嗎?
當用戶登錄到我的網站時,我想打開與另一臺服務器的連接。用戶對我的服務器的請求會轉化爲對該服務器的讀/寫請求。只要用戶登錄,與該服務器的連接對象應該處於活動狀態,這樣我就不需要重新連接每個用戶請求。Ruby on Rails:如何讓對象在許多請求中保持活動狀態?
據我瞭解軌道上的ruby,一旦請求完成,控制器/幫助器中的所有對象都會被清除。我需要保持該對象在多個請求中保持活動狀態,直到用戶註銷。
架構方面,在RoR框架中可以放置這樣的對象嗎?
我傾向於只使用一個輔助函數,它有一個帶有或等於的類級方法來設置連接,例如,
def server_connection
@@connection ||= MyConnectionClass.new(variables, to, set, up, connection)
end
死的簡單,現在你堅持在整個會話的連接,並設置它,如果它尚未設置
EDIT(紅寶石的輝煌||=
運營商。):剛剛意識到這是每個用戶,我可能只是修改我的當前版本,以包含基於用戶ID的散列,存儲連接,簡單易用,只需記住在用戶註銷或閒置太久時關閉連接。它似乎是一個很好的選擇小封裝它實際上
def server_connection(user)
@@connection_hash ||= {}
@@connection_hash[user.id] ||= MyConnectionClass.new(variables, to, set, up, connection, for user)
end
看起來它會建立一個連接,但僅限於處理請求的特定工作進程。其他工作者(思考獨角獸)甚至線程不會有相同的連接,更不用說其他Web服務器,如果你通過多個(可能是虛擬的)服務器平衡請求。 – sockmonk
@sockmonk有趣的一點,我想這聽起來是對的。每個工人都會擁有自己的連接,這將會稍微低效。這太遺憾了,因爲我喜歡這個解決方案的代碼是多麼的簡單和優雅。 :( –
它看起來不錯和優雅,你也需要一個基本的'@@ connection_hash [user.id] .disconnect if @@ connection_hash [user.id]'在註銷時也是這樣,這也很好,很簡單,直到你有擔心所有單獨的工作人員與他們各自的連接斷開...... – sockmonk
基本上,我認爲你的問題的答案是否定的。有些方法可以在請求之間爲用戶存儲'基本'數據,無論是在數據庫中,在memcache中還是在redis中,或者類似的東西,但所有這些對於可以乾淨序列化的數據來說都是最好的:數字,字符串,可能存儲日期作爲字符串。但是任何類型的網絡連接都無法在請求之間可靠地序列化和反序列化,無論是對數據庫還是其他網絡資源(如外部Web服務)。
不知道你想保持開放的連接類型的任何細節,我認爲你可能會更好,只需每次從rails提供一個新的請求到該服務。如果這是一個長期的請求,你可以做的一件事就是在後臺進程中執行這些請求。然後,Web客戶端JS代碼將發出初始請求,取回請求ID,然後每隔幾秒鐘用請求ID ping導航應用程序,以查看響應是否已準備就緒。準備就緒後,它可以讀取響應等。這不會減少發出請求和獲得響應的總時間,但它可以使頁面看起來更響應用戶。
寶石「連接池」工作得很好。
https://github.com/mperham/connection_pool
它可以讓你在不同客戶端的池分配的連接。
您可以創建一個初始化文件,它將創建10個客戶端來分發連接/工作。 配置/初始化/ connections.rb
$conn_pool = ConnectionPool::Wrapper.new(size: 10, timeout: 3) {
MyConnectionClass.new(my_conn_variables)
}
而且你可以在你的代碼,這樣使用它。
app/helpers/my_helper。rb
$conn_pool.send_to_my_server()
詢問代碼的問題必須證明對所解決問題的最小理解。包括嘗試的解決方案,爲什麼他們不工作,以及預期的結果 –
@Monk_Code這不是一個代碼問題;它更多的是一個概念問題。他們的措辭可能會讓他們看起來像是直接要求代碼,但更多的是他們要求如何(在概念上)在請求之間持久化Ruby對象。 –
@ user3545974如果每個請求都應委託給其他服務器,那麼您的Rails應用程序實際上在做什麼?另外我不認爲你需要擔心在請求之間維護與其他服務器的持久連接;允許連接打開和關閉,這是正常的。你在這方面擔心什麼? –