|
WCF + подписки
|
|||
---|---|---|---|
#18+
Есть некий источник событий, в пике в секунду создается 4-6 новых событий которые нужно рассылать подписчикам. (примерно 500). реализован сервис InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple события рассылаются следующим образом. просто проходим циклом по всем подписчикам и вызываем callback. все работает отлично пока какой-нибудь клиент не отваливается. соответственно все ждут пока истечет таймаут. есть идея реализовать это так: заводим пул потоков для рассылки событий, и для каждого подписчика выбираем свободный поток и ставим задачу по отправке. но опять же это частное решение. так как например если из 500 клиентов отпадет половина то можно весь пул забить задачами которые будут висеть по таймауту. (или в ситуации когда в пуле нет свободных потоков, расширять пул?) решается ли как то эта проблема штатными средствами wcf? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2012, 14:36 |
|
WCF + подписки
|
|||
---|---|---|---|
#18+
noob123, Тоже было бы интересно решение... начал городить что-то подобное, но какое-скверное чувство что вс должно быть не так совсем - как то сама модель подписки ломается... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2012, 21:26 |
|
WCF + подписки
|
|||
---|---|---|---|
#18+
noob123так как например если из 500 клиентов отпадет половина то можно весь пул забить задачами которые будут висеть по таймауту. (или в ситуации когда в пуле нет свободных потоков, расширять пул?) решается ли как то эта проблема штатными средствами wcf? решается, только к wcf это отношения не имеет, можете вообще каждый callback отправлять в новом потоке ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2012, 13:03 |
|
WCF + подписки
|
|||
---|---|---|---|
#18+
кстати уточнение, все что выше работает с учетом <reliableSession enabled="true"/> тоесть используются надежные сеансы. если же их отключить. то при отключении клиента, например даже если физически отрубить от сети, вываливается событие OperationContext.Current.Channel.Faulted += new EventHandler(Channel_Faulted); причем почти моментально (причем даже если сообщения никакие не рассылать). правда не очень понимаю как это происходит? тоесть получается какой то механизм типа пинга есть? (и не снизит ли это общую производительность при большом количестве клиентов?) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2012, 08:57 |
|
WCF + подписки
|
|||
---|---|---|---|
#18+
Странно у меня соединения отваливаются моментально... создай в интерфейсе пустую процедуру Код: vbnet 1. 2. 3. 4. 5. 6.
И вызывай ее перед тем как отправлять что либо на клиент, если соединения нет, то исключение вылетает моментально... во всяком случае у меня так. Вот как мой сервер время от времени проверяет отвалившиеся клиенты: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 10:28 |
|
|
start [/forum/topic.php?fid=19&fpage=14&tid=1397155]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 140ms |
0 / 0 |