2015-06-09 11 views
16

मैं यहां एक एज़ूर सेवा फैब्रिक एप्लिकेशन पर काम कर रहा हूं जहां मेरे पास कुछ अभिनेता हैं जिन्हें मांग पर अन्य सेवाओं से पिंग/हुक प्राप्त करने की आवश्यकता है।Azure सेवा फैब्रिक में पब/उप पैटर्न

  • एक घटना रूटर अभिनेता कि में एक घटना ले जा सकते हैं और फिर उस घटना प्रकार के सभी ग्राहकों के लिए है कि घटना के वितरण की देखभाल: आवेदन घटना वितरण इंजन का एक प्रकार है कि कुछ इस तरह काम करने का इरादा है है।
  • 0..N ईवेंट सदस्यता अभिनेता जिन्हें किसी भी तरह से राउटर को सूचित करने की आवश्यकता है कि वे किस तरह की घटनाओं की सदस्यता लेना चाहते हैं और वे उन्हें कैसे वितरित करना चाहते हैं (सिंक या एसिंक)।
  • जब घटना राउटर अभिनेता को MyEvent प्रकार की घटना प्राप्त होती है, तो यह पहचान जाएगा कि ग्राहक क्या सुन रहे हैं और वे ईवेंट को कैसे वितरित करना चाहते हैं। एसिंक्रोनस डिलीवरी के लिए, एक Azure सेवा बस विषय में एक संदेश पॉप किया जाएगा। सिंक्रोनस डिलीवरी के लिए, राउटर अभिनेता सब्सक्राइब करने वाले अभिनेताओं पर सदस्यता विधि का आह्वान करेगा, उनकी प्रतिक्रिया का इंतजार कर रहा है।

इनमें से अधिकांश काफी सीधे आगे हैं, लेकिन मुझे पूरा यकीन नहीं है कि मैं इन घटनाओं के सिंक्रोनस डिलीवरी को कैसे खींचूँगा। मैं नहीं चाहता कि इवेंट राउटर अभिनेता किसी भी तरह से घटनाओं की सदस्यता लेने वाले कलाकारों में किसी भी इंटर्न के बारे में जागरूक रहें - फिर भी वर्तमान ActorProxy कार्यान्वयन और इसी तरह, इंटरफेस तक पहुंच रखने के लिए अन्य कलाकारों पर तरीकों का आह्वान करना आवश्यक है।

कहें कि मैं इवेंट राउटर को सूचित करता हूं कि मेरा पता fabric:/MyApp/MyEventSubscriberActor है और मैं MyEvent पर सदस्यता लेना चाहता हूं। क्या सेवा फैब्रिक एपीआई के भीतर कोई समझदार तरीका है, मैं प्रोग्रामर के बिना उस अभिनेता पर एक विधि का आह्वान कर सकता हूं (उदाहरण के लिए OnEventAsync(MyEvent ev)ActorProxy.Create<IMyEventSubscriberActor>() विधि का उपयोग कर? इन एपीआई का स्रोत कोड सार्वजनिक रूप से उपलब्ध नहीं प्रतीत होता है, इसलिए मेरे पास कोई सीधा तरीका नहीं है यह जांचने के लिए कि यह हुड के तहत कैसे किया जाता है।

+0

मैं तुम क्यों सिंक्रोनस और एसिंक्रोनस दोनों जब तक करना चाहते हैं पर थोड़ा उत्सुक हूँ कुछ घटनाओं को एक अलग एप्लिकेशन पर भेजना था जिसे आप Azure Service Bus Topic को भेजना चाहते हैं। मेरे पास अन्य अवलोकन है, एक पब/उप बनाने से स्केलेबिलिटी में आपकी मदद नहीं होगी क्योंकि राउटर अभिनेता तब तक अवरुद्ध है जब तक कि ग्राहक अभिनेता कार्य पूरा नहीं कर लेता है।क्या आपने "आग और भूलने" के बारे में सोचा है जहां ग्राहक अभिनेता एक विश्वसनीय Queue से घटनाओं को चुनते हैं। –

+0

दरअसल मैं इस बारे में थोड़ा सोच रहा हूं; मुझे लगता है कि मैं बस सिंक्रोनस इवेंट डिलीवरी कर बोर्ड के साथ कर रहा हूं और उसके बाद ग्राहक खुद ही यह निर्धारित कर सकता है कि क्या उसे तुरंत ईवेंट को संसाधित करना चाहिए या इसे एसिंक प्रोसेसिंग के लिए विश्वसनीय विश्वसनीय पर पॉप करें। इनपुट के लिए धन्यवाद। –

+0

मुझे लगता है कि आग के साथ और एसिंक्रोनस विधि भूल जाते हैं, तो आप सिंक्रोनस तरीके से संसाधित करने की तुलना में अधिक घटनाओं को संसाधित करने में सक्षम हो सकते हैं। –

उत्तर

25

इवेंट सदस्यता अभिनेता एक ईवेंट सदस्यता इंटरफ़ेस को कार्यान्वित कर सकता है जिसमें "ईवेंट-उपलब्ध" विधि शामिल है। यह उस इंटरफ़ेस को "सब्सक्राइब-टू-इवेंट" विधि पर पास कर सकता है इवेंट राउटर अभिनेता इंटरफ़ेस।

इवेंट राउटर अभिनेता इंटरफ़ेस अपने राज्य के हिस्से के रूप में सदस्यता इंटरफ़ेस का संदर्भ रख सकता है। जब ग्राहक के लिए ब्याज की घटना होती है, तो यह "ईवेंट-उपलब्ध" मेथो को कॉल कर सकता है डी इंटरफ़ेस पर जो इसे पहले प्राप्त और सहेजा गया था। यह सब इवेंट सब्सक्रिप्शन अभिनेता के साथ संवाद करने के लिए स्पष्ट रूप से अभिनेता प्रॉक्सी बनाने के बिना किया जा सकता है (अभिनेता क्रमबद्धता बुनियादी ढांचे को हुड के नीचे करता है)।

यहां एक बहुत ही बुनियादी उदाहरण है जो घटना प्रकार को छोड़ देता है, केवल एक ग्राहक मानता है, लेकिन आपको तकनीक का एक विचार देना चाहिए।

इंटरफेस:

interface IEventRouter : IActor 
{ 
    void Subscribe(IEventSubscriber subscriber); 
} 

interface IEventSubscriber : IActor 
{ 
    void EventAvailable(); 
} 

घटना ग्राहक कोड:

class EventSubscriber : Actor, IEventSubscriber 
{ 
    void SubscribeToEvent() 
    { 
     IEventRouter router = ActorProxy.Create<IEventRouter>("fabric:/MyApp/MyEventRouterActor"); 
     router.Subscribe(this); 
    } 

    public void EventAvailable() 
    { 
     // Process the event 
    } 
} 

घटना रूटर कोड:

// Define actor state 
[DataContract] 
class RouterState 
{ 
    [DataMember] 
    public IEventSubscriber Subscriber; 
} 

// Define actor 
class EventRouter : Actor<RouterState>, IEventRouter 
{ 
    public void Subscribe(IEventSubscriber subscriber) 
    { 
     this.State.Subscriber = subscriber; 
    } 

    void OnEventAvailable() 
    { 
     this.State.Subscriber.EventAvailable(); 
    } 
}  
+1

ओह, वाह, यह वास्तव में काफी सुरुचिपूर्ण था और कुछ ऐसा नहीं था जिसे मैंने नहीं सोचा था। मेरा दिमाग इस सोच में बहुत ताला लगा था कि एक इंटरफेस का मतलब एक अभिनेता है; इस उद्देश्य के लिए कई अभिनेता प्रकारों में इंटरफेस का पुन: उपयोग करना मेरे दिमाग को पार नहीं कर पाया था। इनपुट की सराहना करें, यह शायद ठीक है। –

+6

यह जानना बहुत उपयोगी है कि धारावाहिक आधारभूत संरचना इंटरफ़ेस-टू-एक्टर प्रॉक्सी मानचित्रण को संभालती है। धन्यवाद! इससे यह परिदृश्य * मुझे डरने से ज्यादा * आसान बनाता है। –

+1

पब/उप इंजन/ढांचे के लिए आप इस nuget पैकेज ServiceFabric.PubSubActors का उपयोग करते हैं। कोड github में उपलब्ध है: https://github.com/loekd/ServiceFabric.PubSubActors – alltej

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