<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: CQRS w praktyce</title>
	<atom:link href="http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/feed/" rel="self" type="application/rss+xml" />
	<link>http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/</link>
	<description>Szymon Pobiega about software engineering and architecture</description>
	<lastBuildDate>Fri, 03 Feb 2012 10:29:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<meta xmlns="http://www.w3.org/1999/xhtml" name="robots" content="noindex,follow" />
	<item>
		<title>By: Szymon Pobiega</title>
		<link>http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/comment-page-1/#comment-656</link>
		<dc:creator>Szymon Pobiega</dc:creator>
		<pubDate>Mon, 22 Feb 2010 11:42:31 +0000</pubDate>
		<guid isPermaLink="false">http://simon-says-architecture.com/?p=425#comment-656</guid>
		<description>W moim przykładzie do synchronizacji wykorzystuje moją ulubioną bibliotekę do komunikacji -- NServiceBus. NSB korzysta z kolejek MSMQ, aby transakcyjne przesyłać wiadomości: wiadomość jest wysyłana w tej samej transakcji rozproszonej, co zapis danych po stronie transakcyjnej, natomiast odczyt -- w tej samej, co aktuaizacja modelu raportowego.

W przykładzie wykorzystuje jedną bazę danych (w sensie serwera) i dwa schematy, ale równie dobrze mogłyby to być zarówno dwie bazy danych, jak i dwa zupełnie różne serwery. Jestem w trakcie przygotowywania przykładu z modelem raportowym zrobionym na innej bazie i mapowaniem w oparciu o Linq 2 SQL.</description>
		<content:encoded><![CDATA[<p>W moim przykładzie do synchronizacji wykorzystuje moją ulubioną bibliotekę do komunikacji &#8212; NServiceBus. NSB korzysta z kolejek MSMQ, aby transakcyjne przesyłać wiadomości: wiadomość jest wysyłana w tej samej transakcji rozproszonej, co zapis danych po stronie transakcyjnej, natomiast odczyt &#8212; w tej samej, co aktuaizacja modelu raportowego.</p>
<p>W przykładzie wykorzystuje jedną bazę danych (w sensie serwera) i dwa schematy, ale równie dobrze mogłyby to być zarówno dwie bazy danych, jak i dwa zupełnie różne serwery. Jestem w trakcie przygotowywania przykładu z modelem raportowym zrobionym na innej bazie i mapowaniem w oparciu o Linq 2 SQL.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Thomas</title>
		<link>http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/comment-page-1/#comment-655</link>
		<dc:creator>Thomas</dc:creator>
		<pubDate>Mon, 22 Feb 2010 10:47:34 +0000</pubDate>
		<guid isPermaLink="false">http://simon-says-architecture.com/?p=425#comment-655</guid>
		<description>Dziekuje Wam za wytlumaczenia. Jest to naprawde interesujace podejscie i musze sie tym bardziej zainteresowac. Sciagnolem juz kod Szymona ale jeszcze nie mialem czasu popatrzec jak to wszystko jest zrobione.

Jedyne pytanie jakie bym mial, to : W jaki sposob dane sa synchronizowane miedzy modelem dla zapytan i dla komend ?

Z tego co rozumiem, logicznie moglibysmy kozystac z dwuch baz danych lub majac dwa oddzielne schematy.</description>
		<content:encoded><![CDATA[<p>Dziekuje Wam za wytlumaczenia. Jest to naprawde interesujace podejscie i musze sie tym bardziej zainteresowac. Sciagnolem juz kod Szymona ale jeszcze nie mialem czasu popatrzec jak to wszystko jest zrobione.</p>
<p>Jedyne pytanie jakie bym mial, to : W jaki sposob dane sa synchronizowane miedzy modelem dla zapytan i dla komend ?</p>
<p>Z tego co rozumiem, logicznie moglibysmy kozystac z dwuch baz danych lub majac dwa oddzielne schematy.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Szymon Pobiega</title>
		<link>http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/comment-page-1/#comment-654</link>
		<dc:creator>Szymon Pobiega</dc:creator>
		<pubDate>Mon, 22 Feb 2010 04:50:49 +0000</pubDate>
		<guid isPermaLink="false">http://simon-says-architecture.com/?p=425#comment-654</guid>
		<description>@Thomas

rafalb już sporo powiedział. Ja ze swojej strony podkreślę jeszcze kwestię optymalizacji. Miałem przypadek systemu, który zarządzał rachunkami. Rozdzielenie modeli do komend i do zapytań (mimo iż oba pracowały na wspólnej bazie danych) pozwoliło mi w modelu komend zrealizować różne typy rachunków przez dziedziczenie, podczas gdy w modelu zapytań mam enum &quot;Typ&quot;. 

Dzięki możliwości wprowadzenia dziedziczenia mogłem znaczenie zmodyfikować zachowanie &quot;rachunku technicznego&quot; (w porównaniu do klienckiego). Usunąłem konieczność zapisu salda, co pozwoliło mi wykorzystywać jeden rachunek techniczny naraz w dowolnej ilości transakcji (jedyna operacja na nim wykonywana to &quot;insert&quot; do tabeli z listą operacji -- brak blokady na poziomie SQL).

Nie muszę chyba mówić, jak bardzo zwiększyło to przepustowość mojego modelu:-)</description>
		<content:encoded><![CDATA[<p>@Thomas</p>
<p>rafalb już sporo powiedział. Ja ze swojej strony podkreślę jeszcze kwestię optymalizacji. Miałem przypadek systemu, który zarządzał rachunkami. Rozdzielenie modeli do komend i do zapytań (mimo iż oba pracowały na wspólnej bazie danych) pozwoliło mi w modelu komend zrealizować różne typy rachunków przez dziedziczenie, podczas gdy w modelu zapytań mam enum &#8220;Typ&#8221;. </p>
<p>Dzięki możliwości wprowadzenia dziedziczenia mogłem znaczenie zmodyfikować zachowanie &#8220;rachunku technicznego&#8221; (w porównaniu do klienckiego). Usunąłem konieczność zapisu salda, co pozwoliło mi wykorzystywać jeden rachunek techniczny naraz w dowolnej ilości transakcji (jedyna operacja na nim wykonywana to &#8220;insert&#8221; do tabeli z listą operacji &#8212; brak blokady na poziomie SQL).</p>
<p>Nie muszę chyba mówić, jak bardzo zwiększyło to przepustowość mojego modelu:-)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Szymon Pobiega</title>
		<link>http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/comment-page-1/#comment-653</link>
		<dc:creator>Szymon Pobiega</dc:creator>
		<pubDate>Mon, 22 Feb 2010 04:44:32 +0000</pubDate>
		<guid isPermaLink="false">http://simon-says-architecture.com/?p=425#comment-653</guid>
		<description>@dario-g

Od strony &quot;query&quot; jedyną czynnością, która może się nie udać jest aktualizacja danych (w przypadku niezgodności schemy lub innego buga). W takim wypadku jestem skłonny zastosować tradycyjne metody i naprawić problem odpowiednim SQLem. 

Warto zauważyć, że systemy CQRS oparte na event sourcing są o tyle lepsze, że tam istnieje możliwość odtworzenia &quot;od początku świata&quot; wszystkich zdarzeń aktualizujących bazę query. Dzięki temu po naprawie bug-a można po prostu &quot;wygenerować&quot; od początku bazę zamiast łatać SQLami.</description>
		<content:encoded><![CDATA[<p>@dario-g</p>
<p>Od strony &#8220;query&#8221; jedyną czynnością, która może się nie udać jest aktualizacja danych (w przypadku niezgodności schemy lub innego buga). W takim wypadku jestem skłonny zastosować tradycyjne metody i naprawić problem odpowiednim SQLem. </p>
<p>Warto zauważyć, że systemy CQRS oparte na event sourcing są o tyle lepsze, że tam istnieje możliwość odtworzenia &#8220;od początku świata&#8221; wszystkich zdarzeń aktualizujących bazę query. Dzięki temu po naprawie bug-a można po prostu &#8220;wygenerować&#8221; od początku bazę zamiast łatać SQLami.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Szymon Pobiega</title>
		<link>http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/comment-page-1/#comment-652</link>
		<dc:creator>Szymon Pobiega</dc:creator>
		<pubDate>Mon, 22 Feb 2010 04:41:37 +0000</pubDate>
		<guid isPermaLink="false">http://simon-says-architecture.com/?p=425#comment-652</guid>
		<description>@dario-g

Od strony &quot;command&quot; zapis danych i wysyłanie komunikatów jest w pełni transakcyjne -- korzystam z DTC. W przypadku SQLServer-a jest to dosyć proste. Oracle podobno też nieźle sobie radzi. Problemy mogą być w wypadku innych, mniej &quot;enterprajsowych&quot; baz danych, takich jak MySQL. Zakładam jednak, że wtedy nie wykorzystywalibyśmy NSB, tylko jakieś lekkie rozwiązanie (AtomPub?)
Sposób, w jaki osiągnąłem transakcyjność opisałem tutaj: http://simon-says-architecture.com/2010/01/13/nhibernate-nservicebus-i-transakcje. Nie jestem z niego bardzo zadowolony. W kodzie NServiceBus wykorzystywana jest (i działa!) natywna integracja NHibernate i System.Transactions. Póki co nie wiem, skąd wynikają moje problemy z zastosowaniem tego mechanizmu:\</description>
		<content:encoded><![CDATA[<p>@dario-g</p>
<p>Od strony &#8220;command&#8221; zapis danych i wysyłanie komunikatów jest w pełni transakcyjne &#8212; korzystam z DTC. W przypadku SQLServer-a jest to dosyć proste. Oracle podobno też nieźle sobie radzi. Problemy mogą być w wypadku innych, mniej &#8220;enterprajsowych&#8221; baz danych, takich jak MySQL. Zakładam jednak, że wtedy nie wykorzystywalibyśmy NSB, tylko jakieś lekkie rozwiązanie (AtomPub?)<br />
Sposób, w jaki osiągnąłem transakcyjność opisałem tutaj: <a href="http://simon-says-architecture.com/2010/01/13/nhibernate-nservicebus-i-transakcje" rel="nofollow">http://simon-says-architecture.com/2010/01/13/nhibernate-nservicebus-i-transakcje</a>. Nie jestem z niego bardzo zadowolony. W kodzie NServiceBus wykorzystywana jest (i działa!) natywna integracja NHibernate i System.Transactions. Póki co nie wiem, skąd wynikają moje problemy z zastosowaniem tego mechanizmu:\</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: rafalb</title>
		<link>http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/comment-page-1/#comment-651</link>
		<dc:creator>rafalb</dc:creator>
		<pubDate>Sun, 21 Feb 2010 19:54:35 +0000</pubDate>
		<guid isPermaLink="false">http://simon-says-architecture.com/?p=425#comment-651</guid>
		<description>Główną zaletą jest rozdzielenie całego procesu modelowania dziedziny od optymalizowania - ponieważ scenariusz Command jest wykonywany znacznie rzadziej, a za to bazę &quot;raportową&quot; możemy dowolnie optymalizować, przygotowując np. spłaszczone tabele z większą redundancją. To ostatecznie obala argumenty z kategorii &quot;niewydajne ORM-y&quot;, a zarazem jest poprawne politycznie, bo uwzględnia ew. stanowisko dla DBA, dzięki czemu w wielu firmach to podejście ma szanse na akceptację :)

Osobiście widzę pewną dodatkową zaletę - bezpieczeństwo. Dzięki takiemu oddzieleniu teoretycznie możemy sobie pozwolić na udostępnienie większych możliwości zapytań dla warstw zewnętrznych bez obawy, że nasze główne źródło danych zostanie uszkodzone. Ale oczywiście ta koncepcja wymagałaby rozwinięcia i poeksperymentowania...</description>
		<content:encoded><![CDATA[<p>Główną zaletą jest rozdzielenie całego procesu modelowania dziedziny od optymalizowania &#8211; ponieważ scenariusz Command jest wykonywany znacznie rzadziej, a za to bazę &#8220;raportową&#8221; możemy dowolnie optymalizować, przygotowując np. spłaszczone tabele z większą redundancją. To ostatecznie obala argumenty z kategorii &#8220;niewydajne ORM-y&#8221;, a zarazem jest poprawne politycznie, bo uwzględnia ew. stanowisko dla DBA, dzięki czemu w wielu firmach to podejście ma szanse na akceptację <img src='http://simon-says-architecture.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Osobiście widzę pewną dodatkową zaletę &#8211; bezpieczeństwo. Dzięki takiemu oddzieleniu teoretycznie możemy sobie pozwolić na udostępnienie większych możliwości zapytań dla warstw zewnętrznych bez obawy, że nasze główne źródło danych zostanie uszkodzone. Ale oczywiście ta koncepcja wymagałaby rozwinięcia i poeksperymentowania&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Thomas</title>
		<link>http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/comment-page-1/#comment-650</link>
		<dc:creator>Thomas</dc:creator>
		<pubDate>Fri, 19 Feb 2010 16:40:28 +0000</pubDate>
		<guid isPermaLink="false">http://simon-says-architecture.com/?p=425#comment-650</guid>
		<description>Dzieki za wytlumaczenie krok po kroku. Nie za bardzo sie interesowalem CQRS zanim nie zaczalem czytac twoich postow na ten temat. Ale prawde mowiac niedokladnie widze &quot;wartosci&quot; jaka by mi przynioslo zastosowanie CQRS w aktualniej architekturze. Osobiscie stosuje klasyczna DDD z wykorzystaniem IoC. Czyli obiekty domeny sa zgrupowane w agregaty ktore sa manipulowane przez repozytoria. Uzywam tez AutoMappera aby polaczyc model prezentacji z modelem domeny. Pewnie, niedostrzeglem czegos waznego w twoich postach, ale jakbys mogl mnie nakierowac to bylbym wdzieczny.</description>
		<content:encoded><![CDATA[<p>Dzieki za wytlumaczenie krok po kroku. Nie za bardzo sie interesowalem CQRS zanim nie zaczalem czytac twoich postow na ten temat. Ale prawde mowiac niedokladnie widze &#8220;wartosci&#8221; jaka by mi przynioslo zastosowanie CQRS w aktualniej architekturze. Osobiscie stosuje klasyczna DDD z wykorzystaniem IoC. Czyli obiekty domeny sa zgrupowane w agregaty ktore sa manipulowane przez repozytoria. Uzywam tez AutoMappera aby polaczyc model prezentacji z modelem domeny. Pewnie, niedostrzeglem czegos waznego w twoich postach, ale jakbys mogl mnie nakierowac to bylbym wdzieczny.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Szymon Pobiega</title>
		<link>http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/comment-page-1/#comment-649</link>
		<dc:creator>Szymon Pobiega</dc:creator>
		<pubDate>Fri, 19 Feb 2010 14:50:01 +0000</pubDate>
		<guid isPermaLink="false">http://simon-says-architecture.com/?p=425#comment-649</guid>
		<description>Dzięki za pozytywne komentarze:-) O transakcjach będzie zatem w poniedziałek.</description>
		<content:encoded><![CDATA[<p>Dzięki za pozytywne komentarze:-) O transakcjach będzie zatem w poniedziałek.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Procent</title>
		<link>http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/comment-page-1/#comment-648</link>
		<dc:creator>Procent</dc:creator>
		<pubDate>Fri, 19 Feb 2010 11:13:11 +0000</pubDate>
		<guid isPermaLink="false">http://simon-says-architecture.com/?p=425#comment-648</guid>
		<description>Bardzo fajny post, mam nadzieję na więcej.</description>
		<content:encoded><![CDATA[<p>Bardzo fajny post, mam nadzieję na więcej.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: dario-g</title>
		<link>http://simon-says-architecture.com/2010/02/19/cqrs-w-praktyce/comment-page-1/#comment-647</link>
		<dc:creator>dario-g</dc:creator>
		<pubDate>Fri, 19 Feb 2010 10:10:17 +0000</pubDate>
		<guid isPermaLink="false">http://simon-says-architecture.com/?p=425#comment-647</guid>
		<description>Fajnie opisane krok po kroku. Brakuje tylko ze dwa słowa o transakcji oraz co w przypadku wystąpienia wyjątku przy zapisie, ale jak sądzę pewnie będzie o tym w kolejnym poście. :)</description>
		<content:encoded><![CDATA[<p>Fajnie opisane krok po kroku. Brakuje tylko ze dwa słowa o transakcji oraz co w przypadku wystąpienia wyjątku przy zapisie, ale jak sądzę pewnie będzie o tym w kolejnym poście. <img src='http://simon-says-architecture.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
</channel>
</rss>

