8

मैंने ActionCable.server.open_connections_statistics, ActionCable.server.connections.length, ActionCable.server.connections.map(&:statistics), ActionCable.server.connections.select(&:beat).count और जैसा देखा है, हालांकि यह केवल "प्रति प्रक्रिया" (सर्वर, कंसोल, सर्वर कार्यकर्ता, et cetera) है। मैं इस समय सभी को कैसे ढूंढूं, जिन्होंने इस समय एक्शनकेबल की सदस्यता ली है? यह प्रत्येक पर्यावरण (विकास, स्टेजिंग, उत्पादन) में किसी भी रेल प्रक्रिया पर एक ही मूल्य वापस करना चाहिए। तो उदाहरण के लिए, विकास कंसोल में आप विकास सर्वर पर कनेक्शन भी देख सकते हैं क्योंकि सिद्धांत रूप में, वे एक ही सदस्यता एडाप्टर (रेडिस, एसिंक, पोस्टग्रेस) का उपयोग करते हैं।मैं कैसे पता लगा सकता हूं कि एक्शनकेबल से कौन जुड़ा है?

रेल 5.0.0.beta3, रूबी 2.3.0

संबंधित ActionCable - how to display number of connected users?

उत्तर

13

तो redis का उपयोग कर आप सभी pubsub चैनलों देख सकते हैं।

[2] pry(main)> Redis.new.pubsub("channels", "action_cable/*") 
[ 
    [0] "action_cable/Z2lkOi8vbWFvY290LXByb2plL3QvUmVzcG9uXGVyLzEx", 
    [1] "action_cable/Z2lkOi8vbWFvY290LXByb2plL3QvUmVzcG9uXGVyLzI" 
] 

यह सभी प्यूमा श्रमिकों के साथ सभी वेबसाइकिल कनेक्शन दिखाएगा। और यदि आपके पास एकाधिक सर्वर हैं तो शायद यह उन लोगों को भी दिखाएगा।

+0

यह _exactly_ जो मैं ढूंढ रहा था; धन्यवाद। – b264

+2

क्या उन्हें अलग करने का कोई तरीका है, जैसे कमरे या कुछ? – plombix

+0

@plombix कृपया नीचे दिए गए मेरे उत्तर को देखें –

3

ActionCable (और Redis करने के लिए) के लिए और अधिक विशिष्ट होना करने के लिए ...

इस चैनल मान लिया जाये:

class RoomChannel < ApplicationCable::Channel 
end 

बजाय यह अपने आप को बनाने के (आप आवश्यकता होगी ActionCable से Redis एडाप्टर जाओ अन्यथा config/cable.yml से URL की आपूर्ति के लिए):

pubsub = ActionCable.server.pubsub 

channel_prefix यो सहित चैनल का नाम भी जाओ यू config/cable.yml में निर्दिष्ट किया है हो सकता है:

channel_with_prefix = pubsub.send(:channel_with_prefix, RoomChannel.channel_name) 

RoomChannel से सभी जुड़े चैनलों प्राप्त करें:

# pubsub.send(:redis_connection) actually returns the Redis instance ActionCable uses 
channels = pubsub.send(:redis_connection). 
    pubsub('channels', "#{channel_with_prefix}:*") 

डिकोड सदस्यता नाम:

subscriptions = channels.map do |channel| 
    Base64.decode64(channel.match(/^#{Regexp.escape(channel_with_prefix)}:(.*)$/)[1]) 
end 

आप एक ActiveRecord वस्तु की सदस्यता ली है, तो मान लें Room (stream_for का उपयोग करके), आप आईडी निकाल सकते हैं:

# the GID URI looks like that: gid://<app-name>/<ActiveRecordName>/<id> 
gid_uri_pattern = /^gid:\/\/.*\/#{Regexp.escape(Room.name)}\/(\d+)$/ 
chat_ids = subscriptions.map do |subscription| 
    subscription.match(gid_uri_pattern) 
    # compacting because 'subscriptions' include all subscriptions made from RoomChannel, 
    # not just subscriptions to Room records 
end.compact.map { |match| match[1] } 
संबंधित मुद्दे

 संबंधित मुद्दे