{"id":297,"date":"2019-01-16T22:14:01","date_gmt":"2019-01-16T21:14:01","guid":{"rendered":"http:\/\/discreteempire.com\/?p=297"},"modified":"2021-02-28T15:17:57","modified_gmt":"2021-02-28T14:17:57","slug":"nie-korzystaj-z-axona-i-list","status":"publish","type":"post","link":"https:\/\/discreteempire.pl\/index.php\/2019\/01\/16\/nie-korzystaj-z-axona-i-list\/","title":{"rendered":"Nie korzystaj z Axona i list"},"content":{"rendered":"\n<p>To nie jest tak, \u017ce w Axonie w agregatach i sagach nie mo\u017cna korzysta\u0107 z list. Je\u017celi kolekcja zawiera niewielk\u0105 ilo\u015b\u0107 element\u00f3w, oko\u0142o 1000, to nie ma problemu. Je\u017celi jednak wymagana jest obszerniejsza lista to napotykamy problemy pami\u0119ciowe i wydajno\u015bciowe. Co nale\u017cy zrobi\u0107 aby nie mie\u0107 takich problem\u00f3w?<\/p>\n\n\n\n<h2>Problem pami\u0119ci masowej<\/h2>\n\n\n\n<p>Przechowywanie du\u017cych kolekcji w sadze powoduje du\u017ce zu\u017cycie pami\u0119ci masowej.<\/p>\n\n\n\n<h4><strong>Przyczyna<\/strong><\/h4>\n\n\n\n<p>Podczas zapisywania stanu sagi po przetworzeniu zdarzenia, przy wykorzystaniu JPA, stan jest zapisywany w nowym obiekcie w Postgresie. Powoduje to namno\u017cenie obiekt\u00f3w przechowuj\u0105cych stan sagi. <\/p>\n\n\n\n<p>Je\u017celi\u00a0 w sadze mamy list\u0119 1000 UUID\u00f3w zajmuj\u0105cych po\u00a0128 b i przetworzy ona 1000 zdarze\u0144, przez co b\u0119dzie zapisana 1000 razy, to baza zwi\u0119kszy sw\u00f3j rozmiar o 128 mb.<\/p>\n\n\n\n<h4><strong>Rozwi\u0105zanie<\/strong><\/h4>\n\n\n\n<p>Konfiguracja\u00a0<a href=\"https:\/\/github.com\/AxonFramework\/AxonFramework\/blob\/master\/spring-boot-autoconfigure\/src\/main\/java\/org\/axonframework\/boot\/autoconfig\/JdbcAutoConfiguration.java\">JdbcAutoConfiguration<\/a>\u00a0pomaga. Po jej zastosowaniu\u00a0 stan sagi nie b\u0119dzie zapisywany jako obiekt a kolumna w bazie danych, przez co nowy stan sagi nadpisze stary. Najlepiej po prostu unika\u0107 du\u017cych list w sagach. Je\u017celi musimy zapisa\u0107 du\u017c\u0105 kolekcj\u0119 wtedy trzeba stworzy\u0107 na ni\u0105 dodatkow\u0105 tabel\u0119 w bazie danych lub wykorzysta\u0107 brokera wiadomo\u015bci. My skorzystali\u015bmy z drugiej propozycji. Podczas przetwarzania jednego ze zdarze\u0144 na RabbitMQ wysy\u0142amy rozkazy, kt\u00f3re nast\u0119pnie zostaj\u0105 \u015bci\u0105gni\u0119te i wrzucone na CommandBus.<\/p>\n\n\n\n<h2>Problem pr\u0119dko\u015bci przetwarzania<\/h2>\n\n\n\n<p>Agregaty czy sagi przechowuj\u0105ce du\u017ce listy d\u0142ugo si\u0119 wczytuj\u0105 i zapisuj\u0105.<\/p>\n\n\n\n<h4>Przyczyna<\/h4>\n\n\n\n<p>Axon serializuje i deserializuje d\u0142ug\u0105 list\u0119 na xmla lub jsona.&nbsp;<\/p>\n\n\n\n<h4>Rozwi\u0105zanie<\/h4>\n\n\n\n<p>Usuwamy list\u0119. Dla agregatu rozwi\u0105zanie jest proste, elementy z listy staj\u0105 si\u0119 agregatami, nie ma tu innego rozwi\u0105zania. Z sagami mo\u017ce by\u0107 wi\u0119kszy problem lecz najcz\u0119\u015bciej ta du\u017ca lista nie b\u0119dzie nam potrzebna lub mo\u017cemy wykorzysta\u0107 pomys\u0142y z wcze\u015bniejszego rozwi\u0105zania. W jednym z naszych przypadk\u00f3w list\u0119 uda\u0142o zast\u0105pi\u0107 si\u0119 zliczaniem opublikowanych zdarze\u0144.<\/p>\n\n\n\n<p>Wersja Axon: 3.3.0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>To nie jest tak, \u017ce w Axonie w agregatach i sagach nie mo\u017cna korzysta\u0107 z list. Je\u017celi kolekcja zawiera niewielk\u0105 ilo\u015b\u0107 element\u00f3w, oko\u0142o 1000, to nie ma problemu. Je\u017celi jednak wymagana jest obszerniejsza lista to napotykamy problemy pami\u0119ciowe&#8230; <a class=\"read-more\" href=\"https:\/\/discreteempire.pl\/index.php\/2019\/01\/16\/nie-korzystaj-z-axona-i-list\/\">Read More<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true},"categories":[21],"tags":[26,27,28],"jetpack_featured_media_url":"","jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9lLj4-4N","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":269,"url":"https:\/\/discreteempire.pl\/index.php\/2018\/10\/16\/nie-korzystaj-z-axon-i-jpa\/","url_meta":{"origin":297,"position":0},"title":"Nie korzystaj z Axon i JPA","date":"2018-10-16","format":false,"excerpt":"Problemy z JPA i Axonem nie zaczynaj\u0105 si\u0119 od razu. Pocz\u0105tki s\u0105 wolne, chcesz aby wykona\u0142 si\u0119 jeden rozkaz, p\u00f3\u017aniej sto rozkaz\u00f3w, wszystko przechodzi swobodnie i szybko, nie wida\u0107 \u017cadnego problemu. Gdy zaczyna si\u0119 robi\u0107 powa\u017cnie i musisz wykona\u0107 np. czterdzie\u015bci tysi\u0119cy rozkaz\u00f3w to wtedy zauwa\u017casz dziwne zachowanie swojego komputera.\u2026","rel":"","context":"In &quot;Nie korzystaj z Axona&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":334,"url":"https:\/\/discreteempire.pl\/index.php\/2019\/01\/16\/nie-korzystaj-z-axona-i-tracking-processor\/","url_meta":{"origin":297,"position":1},"title":"Nie korzystaj z Axona i Tracking Processor","date":"2019-01-16","format":false,"excerpt":"Lubi\u0119 placki i Axona. Przez wi\u0119kszo\u015b\u0107 czasu dzia\u0142a szybko, stabilnie i niezawodnie, a problemy, kt\u00f3re sprawia jako\u015b da si\u0119 rozwi\u0105za\u0107. Jednak tym razem b\u0119d\u0119 namawia\u0142 na ca\u0142kowite porzucenie Tracking Processor. Jest to najlepsza funkcjonalno\u015b\u0107 Axona dodana w wersji 3, a zarazem bardzo niedopracowana. Je\u017celi zale\u017cy Ci na pr\u0119dko\u015bci przetwarzania i\u2026","rel":"","context":"In &quot;Nie korzystaj z Axona&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":280,"url":"https:\/\/discreteempire.pl\/index.php\/2018\/10\/14\/wprowadzenie\/","url_meta":{"origin":297,"position":2},"title":"Wprowadzenie","date":"2018-10-14","format":false,"excerpt":"Od czterech lat jestem profesjonalnym klepaczem kodu. Od dw\u00f3ch lat klepi\u0119 ten kod w do\u015b\u0107 nowych technologiach takich jak: Spring BootSpring Boot DataSpring CloudAxon FrameworkPostgresRabbitMQ Przek\u0142ada si\u0119 to na problemy, na kt\u00f3re nawet szesnasta zak\u0142adka z Stack Overflow nie pomaga. \u0179r\u00f3d\u0142em tych problem\u00f3w nie by\u0142 Spring, spokojnie mo\u017cesz korzysta\u0107 dalej,\u2026","rel":"","context":"In &quot;Nie korzystaj z Axona&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":153,"url":"https:\/\/discreteempire.pl\/index.php\/2017\/12\/06\/usprawnienia\/","url_meta":{"origin":297,"position":3},"title":"Usprawnienia","date":"2017-12-06","format":false,"excerpt":"Po cz\u0119\u015bciowej implementacji przyszed\u0142 czas na usprawnienie. Pierwsze na czym si\u0119 skupi\u0142em to agregaty. Nic nowego nie wymy\u015bli\u0142em, po prostu wykona\u0142em metod\u0119 Kopiego Pejsta z Axona. Najwi\u0119ksz\u0105 zalet\u0105 przepisywania tego by\u0142o zrozumienie jak dzia\u0142a metoda apply z\u00a0AggregateLifecycle\u00a0i jest to jedna z ciekawszych implementacji jak\u0105 widzia\u0142em w swoim \u017cyciu. Drugim usprawnieniem\u2026","rel":"","context":"In &quot;Dynamics&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":91,"url":"https:\/\/discreteempire.pl\/index.php\/2017\/11\/05\/lubie-ddd\/","url_meta":{"origin":297,"position":4},"title":"Lubi\u0119 DDD","date":"2017-11-05","format":false,"excerpt":"Na studiach nauczono mnie programowa\u0107 obiektowo, lecz w pracy ta umiej\u0119tno\u015b\u0107 nie bardzo mi si\u0119 przyda\u0142a. Pierwszy du\u017cy projekt, z kt\u00f3rym si\u0119 w niej spotka\u0142em, by\u0142 napisany w architekturze tr\u00f3jwarstwowej. Musia\u0142em zapomnie\u0107 o tym czego si\u0119 wcze\u015bniej nauczy\u0142em i zacz\u0105\u0107 pisa\u0107 strukturalny kod jak w C tylko, \u017ce w Javie.\u2026","rel":"","context":"In &quot;Dynamics&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":133,"url":"https:\/\/discreteempire.pl\/index.php\/2017\/11\/16\/szybki-sprawdzian\/","url_meta":{"origin":297,"position":5},"title":"Szybki sprawdzian","date":"2017-11-16","format":false,"excerpt":"Ju\u017c jaki\u015b czas pisz\u0119 framework Dynamics. Ilo\u015b\u0107 funkcjonalno\u015bci si\u0119 zwi\u0119ksza, wi\u0119c trzeba sprawdzi\u0107 czy to co zosta\u0142o zaimplementowane do czego\u015b si\u0119 przyda. Postanowi\u0142em obs\u0142u\u017cy\u0107 poruszanie si\u0119 Pacmana. Jest to jedna z podstawowych funkcji gry dlatego zdecydowa\u0142em si\u0119 zaimplementowa\u0107 j\u0105 jako pierwsz\u0105. Potrzebne aby posta\u0107 mog\u0142a si\u0119 porusza\u0107: plansza (Gameboard) b\u0119dzie\u2026","rel":"","context":"In &quot;Dynamics&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/posts\/297"}],"collection":[{"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/comments?post=297"}],"version-history":[{"count":4,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/posts\/297\/revisions"}],"predecessor-version":[{"id":349,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/posts\/297\/revisions\/349"}],"wp:attachment":[{"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/media?parent=297"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/categories?post=297"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/discreteempire.pl\/index.php\/wp-json\/wp\/v2\/tags?post=297"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}