2013-09-05 8 views
9

मैं क्लस्टर श्रमिकों के साथ कलाकारों के बीच कनेक्शन के समान पूल को साझा करने का सबसे अच्छा तरीका खोजने की कोशिश कर रहा हूं। -> कार्यकर्ता अभिनेता (100 या उससे अधिक तक हो सकती है) -> MongoDBअक्का और प्रतिक्रियाशीलमोन्गो

कार्यकर्ताओं और MongoDB मैं reactivemongo रखना चाहते हैं के बीच

, हालांकि मुझे यकीन है कि नहीं कर रहा हूँ कैसे वास्तव में करने के लिए

मास्टर अभिनेता: मैं निम्नलिखित संरचना है सभी कलाकारों के बीच कनेक्शन पूल साझाकरण प्रदान करें।

reactivemongo प्रलेखन के अनुसार:

एक MongoDriver उदाहरण एक अभिनेता प्रणाली का प्रबंधन करता है; एक कनेक्शन कनेक्शन के एक पूल का प्रबंधन करता है। आम तौर पर, मोंगोड्राइवर या मोंगोकनेक्शन बनाने के लिए कभी भी एक से अधिक बार तत्काल नहीं किया जाता है। आप एक अयस्क अधिक सर्वर की एक सूची प्रदान कर सकते हैं; ड्राइवर अनुमान लगाएगा कि यह एक स्टैंडअलोन सर्वर या प्रतिकृति सेट कॉन्फ़िगरेशन है। यहां तक ​​कि एक प्रतिकृति नोड के साथ, ड्राइवर अन्य नोड्स की जांच करेगा और उन्हें स्वचालित रूप से जोड़ देगा।

क्या मुझे इसे मास्टर अभिनेता में बनाना चाहिए और फिर प्रत्येक संदेश के साथ बंडल करना चाहिए? तो, यह मास्टर अभिनेता में होगा:

val driver = new MongoDriver 
val connection = driver.connection(List("localhost")) 

और फिर मैं संदेश में अभिनेताओं के लिए कनेक्शन गुजरती हैं। या क्या मुझे प्रत्येक कार्य अभिनेता में कनेक्शन पूछना चाहिए और किसी संदेश में ड्राइवर को पास करना चाहिए?

किसी भी मदद की बहुत सराहना की जाती है। धन्यवाद।

उत्तर

14

मैं मास्टर अभिनेता में driver और connection बनाउंगा। इसके बाद मैं कार्यकर्ता तर्ककारियों के रूप में MongoConnection का उदाहरण लेने के लिए कार्यकर्ता अभिनेताओं की स्थापना करूंगा ताकि प्रत्येक कार्यकर्ता के पास कनेक्शन का संदर्भ हो (जो वास्तव में कनेक्शन के पूल के लिए प्रॉक्सी है)। फिर, preStart जैसे कुछ में, मास्टर अभिनेता श्रमिकों को बनाते हैं (जो मुझे लगता है कि वे रूट किए गए हैं) और कनेक्शन को एक तर्क के रूप में आपूर्ति करते हैं। एक बहुत ही सरल उदाहरण ऐसा दिखाई दे सकता:

class MongoMaster extends Actor{ 
    val driver = new MongoDriver 
    val connection = driver.connection(List("localhost")) 

    override def preStart = { 
    context.actorOf(Props(classOf[MongoWorker], connection).withRouter(FromConfig())) 
    } 

    def receive = { 
    //do whatever you need here 
    ... 
    } 
} 

class MongoWorker(conn:MongoConnection) extends Actor{ 
    def receive = { 
    ... 
    } 
} 

इस कोड को सही नहीं है, लेकिन कम से कम यह उच्च स्तर अवधारणाओं मैं वर्णित को दर्शाता है।

+0

आपके उत्तर के लिए धन्यवाद, यह अच्छा लग रहा है, मैं इसे आज़मा दूंगा। –

6

cmbaxter द्वारा उत्तर तब तक काम करता है जब तक आपको कार्यकर्ता कलाकारों को दूरस्थ रूप से तुरंत चालू करने की आवश्यकता नहीं होती है। MongoConnection serializable नहीं है।

मुझे यह आलेख https://github.com/eigengo/akka-patterns/wiki/Configuration बहुत उपयोगी पाया गया। मूलभूत विचार कॉन्फ़िगर नामक एक विशेषता को लागू करना है, जो मुख्य अनुप्रयोग द्वारा पॉप्युलेट किया जाता है। कलाकार तब मोंटोकनेक्शन जैसे स्थानीय, गैर-धारावाहिक वस्तुओं तक पहुंच प्राप्त करने के लिए उस विशेषता का उपयोग कर सकते हैं।