<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="365021" data-post-id="365021">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="sodapopcan" data-post="21" data-topic="70777">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sodapopcan/48/34668_2.png" class="avatar"> sodapopcan:</div>
<blockquote>
<p>I think it’s <em>much</em> safer to replay all of history than to continually add to and subtract from a single “balance” entry.</p>
</blockquote>
</aside>
<p>I agree it’s a good idea to <em>store</em> the history in such a context (in fact it’s probably a requirement), but I don’t see how it’s safer to materialize the balances at query time. If your database is functioning properly then you should be able to transactionally update the history and balance without issues. If your database is corrupting your data then you’re cooked regardless, it could just as easily corrupt the history!</p>
<p>Materializing the state from the events on every single query would be prohibitively expensive for practically any production use case, I would think. Banks in particular run huge numbers of transactions through clearing accounts IIRC, there is just no way you could actually do this in practice.</p>
<p>Tigerbeetle for example (which is specifically designed to do this one exact thing) stores transfer history by default, but I’m fairly sure they also keep track of the balance for all accounts at the same time. They ensure the data is not corrupted by being <em>really careful</em> about properly checksumming everything all the time, which if you read their design documentation you will realize is actually incredibly difficult (ssd manufacturers and kernel developers hate us).</p>
<p>But again, if your database is not providing correctness guarantees there is no winning anyway!</p>
<aside class="quote no-group" data-username="sodapopcan" data-post="21" data-topic="70777">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sodapopcan/48/34668_2.png" class="avatar"> sodapopcan:</div>
<blockquote>
<p>And of course simpler to find out what accounts looked like at exact points in the past.</p>
</blockquote>
</aside>
<p>Yeah, that makes sense to me, but my understanding is that’s just an audit log, and that event sourcing is doing “something else” (where I don’t understand what “something else” is).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="365021" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/ashevents-event-sourcing-made-simple-for-ash/70777/22">Post #21</a>
	                </div>
	            </div>
              <div id="likers-container-365021" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="365021"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #21"></div>
  </section>
</div>
    <div class="postbit" id="365022" data-post-id="365022">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sodapopcan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sodapopcan/120/34668_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sodapopcan
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="garrison" data-post="22" data-topic="70777">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>Materializing the state from the events on every single query would be prohibitively expensive for practically any production use case, I would think.</p>
</blockquote>
</aside>
<p>That’s where the <a href="https://forum.elixirforum.com/t/ashevents-event-sourcing-made-simple-for-ash/70777/2" rel="nofollow">aforementioned snapshotting</a> comes in, so I don’t think you’d be constantly recreating from all of time, but I don’t have enough production experience with this stuff.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="365022" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/ashevents-event-sourcing-made-simple-for-ash/70777/23">Post #22</a>
	                </div>
	            </div>
              <div id="likers-container-365022" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="365022"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #22"></div>
  </section>
</div>
    <div class="postbit" id="365023" data-post-id="365023">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Mhm, but that’s what throws me off: what is the difference between snapshotting on every event and just, like, not using “event sourcing”? I assume the answer is “the programming model” or something, or perhaps it’s just a blurry distinction in practice. I am curious what a production use-case looks like.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="365023" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/ashevents-event-sourcing-made-simple-for-ash/70777/24">Post #23</a>
	                </div>
	            </div>
              <div id="likers-container-365023" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="365023"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #23"></div>
  </section>
</div>
    <div class="postbit" id="365024" data-post-id="365024">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Pal" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Pal
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Supply side its not only replaying but flexibility of event versioning &amp; for demand side  biz units can produce non-disruptive independent projections: <a href="https://www.youtube.com/live/aYMKE3B5PFM" rel="noopener nofollow ugc">https://www.youtube.com/live/aYMKE3B5PFM</a> (not affiliated)</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="365024" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/ashevents-event-sourcing-made-simple-for-ash/70777/25">Post #24</a>
	                </div>
	            </div>
              <div id="likers-container-365024" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="365024"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #24"></div>
  </section>
</div>
    <div class="postbit" id="365028" data-post-id="365028">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sodapopcan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sodapopcan/120/34668_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sodapopcan
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I can only speak in hypotheticals at this point as it’s been too long.  I started working on a project around 10 years ago using event sourcing but wasn’t on it very long.  I watched talks by Greg Young (who also happens to be an Erlang guy, I think?) which helped.  I’m sure there is a big difference in terms of guarantees and ease-of-use when postgres vs using a “proper” event database like Event Store (which I just learned is now called KurrentDB).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="365028" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/ashevents-event-sourcing-made-simple-for-ash/70777/26">Post #25</a>
	                </div>
	            </div>
              <div id="likers-container-365028" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="365028"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #25"></div>
  </section>
</div>
    <div class="postbit" id="365030" data-post-id="365030">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="olivermt" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/olivermt/120/2354_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  olivermt
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>A bank should use double entry bookkeeping <img src="https://forum.elixirforum.com/images/emoji/apple/stuck_out_tongue.png?v=15" title=":stuck_out_tongue:" class="emoji" alt=":stuck_out_tongue:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="365030" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/ashevents-event-sourcing-made-simple-for-ash/70777/27">Post #26</a>
	                </div>
	            </div>
              <div id="likers-container-365030" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="365030"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #26"></div>
  </section>
</div>
    <div class="postbit" id="365035" data-post-id="365035">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="katafrakt" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/katafrakt/120/34763_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  katafrakt
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="garrison" data-post="22" data-topic="70777">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>If your database is functioning properly then you should be able to transactionally update the history and balance without issues. If your database is corrupting your data then you’re cooked regardless, it could just as easily corrupt the history!</p>
</blockquote>
</aside>
<p>This silently assumes you are using the same database for keeping the events and keeping the projections (a bit different thing than snapshots IMO). This is great if true, but also often not true. In that case the guarantees are much more loose.</p>
<p>But even in one database with transactions, errors will happen. Not because the database is buggy, but because of developers mistakes. The question then is: what do you trust? If your answer is:</p>
<ul>
<li>“Ok, we are probably missing some events in the history. Let’s ignore that or create an equalizing event.” - then you probably don’t have ES, bud CDC</li>
<li>“The state is wrong. Let’s dump it and recreate anew from the events.” - you might have event sourcing.</li>
</ul>
<p>Some may dismiss it as a “programming model” or a “implementation detail”, but for me it’s a fundamental shift on how you think about modeling the data. Is it a series of changes over time? Or rather a set of resources in some state? In that regard I agree with <a class="mention" href="/u/vasspilka" rel="nofollow">@vasspilka</a> (even though I don’t necessarily agree with the need to couple ES with DDD).</p>
<aside class="quote no-group" data-username="garrison" data-post="24" data-topic="70777">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>Mhm, but that’s what throws me off: what is the difference between snapshotting on every event and just, like, not using “event sourcing”?</p>
</blockquote>
</aside>
<p>I don’t have a lot of experience with snapshotting, but I think you rarely create snapshots on every event. Rather once per some period, liek 24 hours, or every 100 events. Other people swear by organizing event in streams, where the number of events per stream is relatively low, so you can always just calculate the state from events (withing a given stream - and you should not need to do that outside of the stream).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="365035" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/ashevents-event-sourcing-made-simple-for-ash/70777/28">Post #27</a>
	                </div>
	            </div>
              <div id="likers-container-365035" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="365035"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #27"></div>
  </section>
</div>
    <div class="postbit" id="365054" data-post-id="365054">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="felix-starman" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/felix-starman/120/18051_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  felix-starman
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>We use commanded where I work very heavily, but it’s too specific.<br>
It has gotten me thinking about applying it to a problem of one of my clients in healthcare.</p>
<p>The use case would be storing potentially billable events as they happen. In this case it’s call-minutes of health coaches, and device readings of patients. The rules for what’s billable by the healthcare provider are extremely complex and depend on the individual events as well as a fair deal of “datemath”.</p>
<p>If the developer misunderstood the datemath, or used the wrong number of required device readings, or there were some other weird thing that’s been going wrong for months, with Event Sourcing you can make a business decision for how to solve it.<br>
In the ideal world where no one has been charged money, you can decide to replay the events through some processor (aggregate), and truncate/drop and recreate/“project” your tables.</p>
<p>You don’t generally get that lucky though. If the bug was around for multiple billing cycles and people have to be reimbursed, and old versions of invoices kept for legal reasons, then you might have other approaches you have to take. In this client’s case they don’t use ES but if they had been a recent bug would have been easier to catch earlier, and orders of magnitude to answer “what should have happened”, but since it spanned a billing cycle where people paid money you would still have to issue balance corrections in the form of new events. You would just do it with a one-off processor to issue new events when the bug would have happened, or make them manually.</p>
<p>Idk, it’s all hard to think about but that’s the point. If the problem is hard to think about when it’s going right, the kind of tools you would want to be able to fix it when it’s going wrong and you don’t know how long usually end up looking like Event Sourcing. Recovering from an error is a side benefit.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="365054" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/ashevents-event-sourcing-made-simple-for-ash/70777/29">Post #28</a>
	                </div>
	            </div>
              <div id="likers-container-365054" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="365054"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #28"></div>
  </section>
</div>
    <div class="postbit" id="365057" data-post-id="365057">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Pal" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Pal
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Triple Entry Accounting ftw <img src="https://forum.elixirforum.com/images/emoji/apple/raising_hands.png?v=15" title=":raising_hands:" class="emoji" alt=":raising_hands:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="365057" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/ashevents-event-sourcing-made-simple-for-ash/70777/30">Post #29</a>
	                </div>
	            </div>
              <div id="likers-container-365057" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="365057"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #29"></div>
  </section>
</div>
    <div class="postbit" id="365060" data-post-id="365060">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="tcoopman" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/tcoopman/120/8112_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  tcoopman
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Some disclaimers before my post:</p>
<ul>
<li>I haven’t read all of the above in detail</li>
<li>I don’t really know Ash expect for that there is so much noise and movement around it that I almost have FOMO for not trying it out <img src="https://forum.elixirforum.com/images/emoji/apple/wink.png?v=15" title=":wink:" class="emoji" alt=":wink:" loading="lazy" width="20" height="20"></li>
<li>I consider myself a DDD expert - it’s my job</li>
</ul>
<p>Having that out of the way, I’d like to make 2 additions:</p>
<p>Firstly, I agree that event sourcing doesn’t say anything about storing state. The only requirement is that you can make new decisions based on the history of what happened. Technically this means that you can rebuild your state from the history of events.</p>
<p>So as long as you store your state and events in the same transaction this is fine if you take care of the following: making sure your events are complete.</p>
<p>If you first build your state and then build the event, you have risk that you forgot to put some attributes on the events, meaning you wouldn’t be able to reconstruct the state accurately.<br>
That’s why in event sourcing we most often have the pattern where we <code>apply</code> the events in order to build the state. That guarantees that our events are complete.</p>
<p>Secondly, about DDD and event sourcing. Sure they are often used together, but they don’t require each other. You can do DDD without event sourcing and the other way around as well.<br>
I would like to add that the value of event sourcing of indeed comes from the fact if your business has any value in storing what actually happened.<br>
A trivial example, is the difference of <code>AddressUpdated</code> vs <code>PersonRelocated</code> relevant for you?<br>
Or <code>StockUpdated</code> vs <code>ItemScannedIn</code> and <code>StockManuallyCorrected</code>?</p>
<p>If  you (or your business - hopefully you are aligned on this <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"> ) don’t care about this difference, then event sourcing will probably not add a lot of value and not be the best choice.<br>
In my opinion though I’ve noticed a lot of complex domains where these kinds of things are very relevant and offer great value to the teams building this. But of course there are downsides as well, so do your own research and understand why building something event sourcing would be valuable for your software.<br>
(Last small remark - you don’t need to apply event sourcing to your full architecture/product, maybe it’s only useful for some complex parts, and the other parts are fine with CRUD/…)</p>
<p>This turned out a bit longer than I had in mind, hopefully it’s useful for someone!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="365060" data-batch-url="/posts/batch_likers">
                        9
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/ashevents-event-sourcing-made-simple-for-ash/70777/31">Post #30</a>
	                </div>
	            </div>
              <div id="likers-container-365060" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="365060"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #30"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/70777/load_more?page=4">Load more posts (14 remaining)</a>
</div></template></turbo-stream>