Търся модел на проектиране, който обработва големи набори от данни през интернет и извършва периодично актуализиране на тези обекти. Разработвам приложение, което ще показва хиляди записи в потребителския интерфейс едновременно. Освен това, различните свойства на тези обекти са доста преходни и трябва да се актуализират на клиента, за да информира потребителя за променящото се състояние на тези записи в системата. Имам няколко идеи как да подходя към този проблем, но реших, че може да има модел (или модели) на проектиране, който се справя с този тип сценарий.
Ограничения:
- Клиентската страна за това се пише на Silverlight.
- Самите обекти не са много големи (около 15 свойства тип стойност и низ), но заявките за всички данни са скъпи. Около 15-те свойства съдържат данни от различни източници; никакъв умен оператор за присъединяване или индексиране няма да ускори заявката. Мисля да попълня само подмножество от свойствата при първоначално зареждане и след това да попълня по-скъпите подробности, докато потребителят увеличава мащаба на дадено групиране от обекти. Помислете за Google Maps, но вместо улици и сгради показва обектите.
- Ще мога да огранича частта от хилядите обекти, които се актуализират. Ще ми е необходимо обаче потребителят да може да „намалява“ контекст, който позволява детайлно актуализиране до такъв, който показва всичките хиляди обекти. Предполагам, че актуализирането ще бъде деактивирано отново за обекти, когато напуснат контекст на достатъчно мащабиране.
Идеи как да се справите с целия или част от този проблем? Както споменах, вече обмислям няколко идеи, но нищо, което съм събрал досега, не ми дава добро усещане за успеха на този проект.
Редактиране:
Мисля, че трудните части наистина се свеждат до две неща, за които може да се нуждая от два различни модела/практики/стратегии:
- Зареждане на голям брой записи през интернет (~5k).
- Поддържане на подмножество от тези обекти (~500) актуализирани през интернет.
Има няколко шаблона за проектиране, които могат да се използват за всичко останало.
Редактиране 2:
Благодаря за връзките за различни "push" реализации в Silverlight. Мога да се закълна, че гнездата бяха извадени от Silverlight, но намерих препратка към Silverlight 3 въз основа на отговор по-долу. Това наистина не беше голям проблем за мен така или иначе и нещо, което не бях прекарал много време в проучване, така че редактирам това от оригиналния текст. Независимо дали актуализациите идват чрез анкети или чрез натискане, общите проблеми с дизайна все още са налице. Хубаво е да знам, че имам опции.
Редактиране 3: Продължаване на push технологиите.
Както подозирах, дуплексната реализация на Silverlight WCF е натискане, подобно на комета. Това няма да се мащабира и има много статии за това как не е така в реалния свят.
Внедряването на сокети в Silverlight е осакатено по няколко начина. Изглежда, че ще бъде безполезен в нашия сценарий, тъй като уеб сървърът може да стои зад дадена клиентска защитна стена, която няма да позволи нестандартни портове и гнездата на Silverlight няма да се свържат на 80, 443 и т.н.
Все още обмислям използването на подхода WCFduplex по някакъв ограничен начин, но изглежда, че гласуването ще бъде отговорът.
Редактиране 4: Намерих модел за решаване на половината ми проблем
Намерих този модел (PDF), който илюстрира използване на модел на итератор за извличане на страници с данни от сървъра и представянето им като обикновен итератор. Предполагам, че в .Net земя това ще бъде реализирано като IEnumerable (примерният код е в Java и Oracle SQL). От особен интерес за мен беше асинхронното предварително извличане на страници, основно буфериране на набора от резултати от страна на клиента. С 5k обекта всичко няма да се побере на екрана наведнъж, така че мога да използвам стратегия да не получавам всичко наведнъж, но все пак да скрия този детайл от изпълнението от потребителския интерфейс. Основните обекти, които приложението ще извлича, са в база данни, след което са необходими други справки за пълно попълване на тези обекти. Тази методология изглежда като добър подход за бързо предаване на част от данните на клиента.
Сега мисля да използвам този шаблон + някакъв модел на прокси обект, който слуша за делта на набора от резултати и съответно актуализира обекта. Има няколко стратегии, които човек може да предприеме тук. Бих могъл да заредя всички данни предварително, след което да изпратя делта на промените (които вероятно ще се нуждаят от допълнителен код в подсистемите, за да предоставят известия за промените). Това може да е първият ми подход. Все още търся. Благодаря за всички идеи досега.