Как да приоритизирате изходящите съобщения с WCF

Бих искал да мога да приоритизирам изходящите данни/съобщения от WCF услуга.

Ето основния сценарий:

  1. Клиентът иска от сървъра поток от данни. Потокът от данни е жив, голям и потенциално безкраен (данни за наблюдение на оборудването). Ще наречем това HighPriorityDataStream.
  2. Клиентът иска допълнителни данни. Ще наречем това LowPriorityData.

Ширината на честотната лента е ограничена (помислете за комутируем модем или сателит). Много е важно текущият HigPriorityDataStream да не бъде прекъсван или забавен, когато се направи заявка за LowPriorityData.

Вече имам базирана на сокети наследена система, където това се постига чрез ръчно контролиране на реда, в който данните се поставят в буфера на гнездото. Данните с висок приоритет се поставят в буфера и ако има останало място, се добавят данни с по-нисък приоритет, за да се запълни останалата част от буфера.

Опитвам се да реинженерирам този процес с WCF... Не знам за готови решения и си мисля, че може да се наложи да напиша персонализирано поведение на канала, но бих искал да избера мозъка на общността, преди да тръгна по този път :)


person Simon Gillbee    schedule 09.08.2010    source източник


Отговори (2)


Мисля, че няма общо взето решение. Решението зависи от вашите други изисквания. Искате ли да контролирате честотната лента на клиент или на цял сървър (всички клиенти)? Искате ли да извикате операция с нисък приоритет от същото прокси или стартирате ново прокси за нова операция? Искате ли да изпълнявате повече операции с висок приоритет едновременно? Искате ли да дадете приоритет на входящите заявки?

Най-лесното решение очаква да контролирате честотната лента на клиент, да използвате повторно един и същ прокси за всички повиквания, само една операция с висок приоритет може да бъде завършена едновременно и заявките се обработват във FIFO ред. След това просто маркирате внедряването на вашата услуга с [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)] (това трябва да е настройка по подразбиране за услуги, изложени през NET.TCP). Тези настройки ще използват повторно един и същ екземпляр на услугата за всички повиквания от един и същ клиентски прокси сървър, но само едно повикване ще бъде обработено в даден момент (другите ще чакат на опашката, докато бъдат обработени или изтече времето).

Поздрави Ладислав

person Ladislav Mrnka    schedule 10.08.2010

След много ровене (благодаря на Ладислав за вашите обмислени идеи), стигнах до извода, че моля комуникационния слой да разреши проблем на бизнес ниво. За по-добро формулиране на проблема, има множество връзки и един източник на данни. Източникът на данни трябва да приоритизира кои данни събира от собствените си източници на данни (потоци от данни на живо, а също и постоянни бази данни) и да изпраща данните обратно на различните клиенти въз основа на техния приоритет. За да бъде ясно, клиентите имат относителен приоритет въз основа на тяхната идентичност, базирана на роли, източниците на данни имат приоритет (предпочитат живи данни пред постоянни данни) и отделните полета в рамките на източник на данни имат приоритетен ред (при равни други условия, полето X трябва винаги да се изпраща преди поле Y).

Всичко това е твърдо бизнес логика и решението, което приехме като набор от приоритетни опашки, които автоматично сортират елементите на входните данни въз основа на тези изисквания за приоритет и след това обслужват всяка заявка в този ред.

person Simon Gillbee    schedule 25.08.2010