मैं एक डब्ल्यूसीएफ सेवा बनाना चाहता हूं जो एमएसएमक्यू बाध्यकारी का उपयोग करता है क्योंकि मेरे पास प्रक्रियाओं की उच्च मात्रा है अधिसूचनाओं को संसाधित करना है। यह महत्वपूर्ण है कि ग्राहकों को सेवा द्वारा नहीं रखा जाता है और अधिसूचनाओं को उनके द्वारा उठाए गए क्रम में संसाधित किया जाता है, इसलिए कतार कार्यान्वयन।एकाधिक डब्ल्यूसीएफ सेवा उदाहरणों के साथ संदेश कतार अनुक्रम को कैसे लागू करें
एक और विचार लचीलापन है। मुझे पता है कि मैं कतार को और अधिक मजबूत बनाने के लिए एमएसएमक्यू को क्लस्टर कर सकता हूं, लेकिन मैं अलग-अलग सर्वरों पर अपनी सेवा का एक उदाहरण चलाने में सक्षम होना चाहता हूं, इसलिए यदि कोई सर्वर अधिसूचनाओं को क्रैश करता है तो कतार में नहीं बनता है लेकिन दूसरा सर्वर प्रोसेसिंग करता है ।
मैंने एमएसएमक्यू बाध्यकारी के साथ प्रयोग किया है और पाया है कि आपके पास एक ही कतार पर एक सेवा के कई उदाहरण हो सकते हैं, और खुद को छोड़ दिया है, वे उपलब्ध सेवाओं में फैले लोड के साथ राउंड-रॉबिन का एक प्रकार कर रहे हैं । यह बहुत अच्छा है, लेकिन मैं कतार की अनुक्रम खोने को समाप्त करता हूं क्योंकि अनुरोधों को संसाधित करने के लिए अलग-अलग उदाहरण अलग-अलग समय लेते हैं।
मैं प्रयोग करने के लिए एक सरल कंसोल ऐप का उपयोग कर रहा हूं, जो नीचे महाकाव्य कोड डंप है। जब यह चलाए जाने के दौरान मैं इस तरह एक आउटपुट मिलता है:
host1 open
host2 open
S1: 01
S1: 03
S1: 05
S2: 02
S1: 06
S1: 08
S1: 09
S2: 04
S1: 10
host1 closed
S2: 07
host2 closed
क्या मैं क्या करना चाहते है:
host1 open
host2 open
S1: 01
<pause while S2 completes>
S2: 02
S1: 03
<pause while S2 completes>
S2: 04
S1: 05
S1: 06
etc.
मैं सोचा होगा S2 पूरा नहीं किया है के रूप में, यह अभी भी असफल और संदेश वापस हो सकता है कि यह कतार में प्रसंस्करण कर रहा था। इसलिए एस 1 को कतार के दूसरे संदेश को खींचने की अनुमति नहीं दी जानी चाहिए। मेरी कतार हमें लेनदेन है और मैंने सेवा पर TransactionScopeRequired = true
सेट करने का प्रयास किया है लेकिन इसका कोई फायदा नहीं हुआ है।
क्या यह भी संभव है? क्या मैं इसके बारे में गलत तरीके से जा रहा हूं? क्या किसी प्रकार की केंद्रीय सिंक्रनाइज़ेशन तंत्र के बिना फेलओवर सेवा बनाने का कोई और तरीका है?
class WcfMsmqProgram
{
private const string QueueName = "testq1";
static void Main()
{
// Create a transactional queue
string qPath = ".\\private$\\" + QueueName;
if (!MessageQueue.Exists(qPath))
MessageQueue.Create(qPath, true);
else
new MessageQueue(qPath).Purge();
// S1 processes as fast as it can
IService s1 = new ServiceImpl("S1");
// S2 is slow
IService s2 = new ServiceImpl("S2", 2000);
// MSMQ binding
NetMsmqBinding binding = new NetMsmqBinding(NetMsmqSecurityMode.None);
// Host S1
ServiceHost host1 = new ServiceHost(s1, new Uri("net.msmq://localhost/private"));
ConfigureService(host1, binding);
host1.Open();
Console.WriteLine("host1 open");
// Host S2
ServiceHost host2 = new ServiceHost(s2, new Uri("net.msmq://localhost/private"));
ConfigureService(host2, binding);
host2.Open();
Console.WriteLine("host2 open");
// Create a client
ChannelFactory<IService> factory = new ChannelFactory<IService>(binding, new EndpointAddress("net.msmq://localhost/private/" + QueueName));
IService client = factory.CreateChannel();
// Periodically call the service with a new number
int counter = 1;
using (Timer t = new Timer(o => client.EchoNumber(counter++), null, 0, 500))
{
// Enter to stop
Console.ReadLine();
}
host1.Close();
Console.WriteLine("host1 closed");
host2.Close();
Console.WriteLine("host2 closed");
// Wait for exit
Console.ReadLine();
}
static void ConfigureService(ServiceHost host, NetMsmqBinding binding)
{
var endpoint = host.AddServiceEndpoint(typeof(IService), binding, QueueName);
}
[ServiceContract]
interface IService
{
[OperationContract(IsOneWay = true)]
void EchoNumber(int number);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class ServiceImpl : IService
{
public ServiceImpl(string name, int sleep = 0)
{
this.name = name;
this.sleep = sleep;
}
private string name;
private int sleep;
public void EchoNumber(int number)
{
Thread.Sleep(this.sleep);
Console.WriteLine("{0}: {1:00}", this.name, number);
}
}
}
आप कठिन समय बाध्यकारी WCF के MSMQ के साथ ऐसा करना (http://stackoverflow.com/questions/729612/ordered-delivery-with-netmsmqbinding देखें) होगा। हालांकि आप लेनदेन संबंधी एमएसएमक्यू और कुछ सुलह कोड (डब्ल्यूसीएफ के बिना) का उपयोग कर सकते हैं। –