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


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Why is it “distributed GenServer”? I don’t see any “distributed” here, it’s more like “durable” or even “persistent”</p>
<p>General idea of durable state machines is nice and very useful, but implementing it with GenServer semantics is a dead end. I think that it is a bad pattern and a very misleading approach.</p>
<p>If I were to make this library a good one, I’d think about it like this:</p>
<h3><a name="p-383941-dgenserver-does-not-work-as-a-genserver-in-any-sense-1" class="anchor" href="#p-383941-dgenserver-does-not-work-as-a-genserver-in-any-sense-1" aria-label="Heading link" rel="nofollow"></a><code>DGenServer</code> does not work as a <code>GenServer</code> in any sense.</h3>
<p>You can’t safely restart this server in order to reset the state, which is a big deal when it comes to how OTP approaches failure safety. Then, performance is completely different. Then, timeouts handling is completely different. Then, interface is completely different (postponing side effects, etc). Then, use-case is completely different. In the end, any comparison with <code>GenServer</code> is wrong and is bringing more harm than good for users who may think that they can just replace their <code>use GenServer</code> with <code>use DGenServer</code> and go on.</p>
<p>So, I’d change the name to something like <code>DurableStateMachine</code>.</p>
<h3><a name="p-383941-messages-2" class="anchor" href="#p-383941-messages-2" aria-label="Heading link" rel="nofollow"></a>Messages</h3>
<p>Even if you rename it and change the interface, there is still a problem: input comes from messages! That is very bad. Most of messages are temporary and contain temporary data like pids, references. Monitors and links result in temporary data. And you save them.</p>
<p>So, I’d separate the state machine from BEAM’s message boxes and remove this process-based <code>handle_info</code>, <code>handle_call</code>, etc. semantic completely.</p>
<p>I’d have just <code>handle_input</code> with manual state handling, without any processes involved.</p>
<h3><a name="p-383941-diff-3" class="anchor" href="#p-383941-diff-3" aria-label="Heading link" rel="nofollow"></a>Diff</h3>
<p>You do diffs to not save the whole state, but your diff implementation is best effort. If you give user the ability to handle the update themselves, it would bring a huge performance benefit in some cases</p>
<h3><a name="p-383941-batching-4" class="anchor" href="#p-383941-batching-4" aria-label="Heading link" rel="nofollow"></a>Batching</h3>
<p>And it would be nice to have the ability to batch the changes, because FDB works much more efficiently with one transaction changing 100 keys than 100 subsequent transactions changing 1 key</p>
<hr>
<p>So, it would look something like this</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyStateMachine do
   use DurableStateMachine
   
   @impl true
   def init(id) do
     {:ok, %{id: id, status: :off, calls: 0}}
   end

   def switch(state) do
     with {:ok, state} &lt;- handle_input(:switch, state) do
       Logger.info("Switched #{state.id} to #{state.status}")
       Logger.debug("#{state.id} received #{state.calls} so far")
       {:ok, state}
     end
   end
   
   @impl true
   def handle_input(:switch, state) do
     next_status =
       case state.status do
         :off -&gt; :on
         :on -&gt; :off
       end

     next_calls = state.calls + 1
 
     # Only status is saved, because `calls` is for debugging
     DurableStateMachine.set({state.id, :status}, next_status)
     
     {:ok, %{state | status: next_status, calls: next_calls}}
   end
end

# And used like this

id = # Some ID here
{:ok, state} = MyStateMachine.get_or_create_new(id)
{:ok, state} = MyStateMachine.switch(state)
IO.inspect state.status
</code></pre>
<p>But this functionality has no batching. If you were to add batching, you’d have to make the transaction explicit and it would make the whole need for library obsolete.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="383941" 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/dgen-a-distributed-genserver/74409/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-383941" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="383941"
                     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 #11"></div>
  </section>
</div>
    <div class="postbit" id="383947" data-post-id="383947">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mudasobwa" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mudasobwa/120/5298_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mudasobwa
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Cure</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>You might want to take a look at my approach to the problem: <a href="https://github.com/am-kantox/peeper" class="inline-onebox" rel="noopener nofollow ugc">GitHub - am-kantox/peeper: Almost drop-in replacement for `GenServer` to preserve state between crashes · GitHub</a></p>
<p>It uses a heir subprocess and preserves not only the state of the <code>GenServer</code>, but also its process dictionary and its <code>ets</code> tables.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="383947" data-batch-url="/posts/batch_likers">
                        3
                      </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/dgen-a-distributed-genserver/74409/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-383947" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="383947"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-most-liked cat-most-liked" title="One of the top 3 liked posts in this thread!"></div>
  </section>
</div>
    <div class="postbit" id="383960" data-post-id="383960">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jstimps" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jstimps/120/37213_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jstimps
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Asd" data-post="12" data-topic="74409">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/a/c68b51/48.png" class="avatar"> Asd:</div>
<blockquote>
<p>Most of messages are temporary and contain temporary data like pids, references. Monitors and links result in temporary data. And you save them.</p>
</blockquote>
</aside>
<p>I fear there may be a misunderstanding here. I blame myself for my poor delivery. DGen is not saving Erlang process messages to a datastore. It saves the cast/call request portion only. It’s up to the programmer to avoid using temporary or localized data such as pids in their cast/call requests. For example, in the ‘increment cast’, we store the term <code>:increment</code>. Also, DGen is in fact storing references in order to dispatch appropriately. However, as far as I know references alone are neither temporary nor local. (A reference can refer to something that is local, but we’re not doing that here)</p>
<aside class="quote no-group" data-username="Asd" data-post="12" data-topic="74409">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/a/c68b51/48.png" class="avatar"> Asd:</div>
<blockquote>
<p>Why is it “distributed GenServer”? I don’t see any “distributed” here, it’s more like “durable” or even “persistent”</p>
</blockquote>
</aside>
<p>You are able to start several instances of a single DGenServer. For a given message, only one of them will consume it and process it. Thus, the state mutations are distributed across several nodes. The functionality provided by that DGenServer is highly available, as any number of them can go down, as long as a single consumer is still alive. They do not coordinate with each other, but rather they coordinate via the distributed message queue and take advantage of strict serializability.</p>
<aside class="quote no-group quote-modified" data-username="Asd" data-post="12" data-topic="74409">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/a/c68b51/48.png" class="avatar"> Asd:</div>
<blockquote>
<p>Diffs and Batching</p>
</blockquote>
</aside>
<p>Can be added as an enhancement if needed.</p>
<p>Thank you for the feedback, especially that the name is misleading. If the <code>DGenServer</code> module name is too bold, I welcome the requests to change it.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="383960" 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/dgen-a-distributed-genserver/74409/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-383960" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="383960"
                     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 #13"></div>
  </section>
</div>
    <div class="postbit" id="383976" data-post-id="383976">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>The Waterpark videos are excellent. Would love to see a full technical write up on how they do it. From memory, nothing is actually persisted to disk - they just have 10+ nodes in a cluster or something similar.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="383976" 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/dgen-a-distributed-genserver/74409/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-383976" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="383976"
                     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 #14"></div>
  </section>
</div>
    <div class="postbit" id="383986" data-post-id="383986">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Indeed. They just have the data in memory on multiple machines and count on the fact that they won’t run into a case where all copies of any individual piece of information drop out at the same time.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="383986" 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/dgen-a-distributed-genserver/74409/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-383986" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="383986"
                     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 #15"></div>
  </section>
</div>
    <div class="postbit" id="383997" data-post-id="383997">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Man, I wouldn’t be able to sleep at night knowing that all data of my app is just in RAM (probably why the idea is so interesting and waterpark videos were indeed great)</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="383997" 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/dgen-a-distributed-genserver/74409/17">Post #16</a>
	                </div>
	            </div>
              <div id="likers-container-383997" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="383997"
                     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 #16"></div>
  </section>
</div>
    <div class="postbit" id="384012" data-post-id="384012">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I am 100% with you. Wouldn’t matter if it was 50 machines, I just want the data written to file somewhere. Probably irrational, but very hard for me to shake. Still, they have had zero downtime in 5 or 7 years or something, so they clearly know what they are doing.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="384012" 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/dgen-a-distributed-genserver/74409/18">Post #17</a>
	                </div>
	            </div>
              <div id="likers-container-384012" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="384012"
                     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 #17"></div>
  </section>
</div>
    <div class="postbit" id="384036" data-post-id="384036">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jstimps" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jstimps/120/37213_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jstimps
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>After watching the first Waterpark talk, it sounds like they’ve implemented an eventually consistent storage engine. This is genuinely hard to get right. Coordinating writes across nodes without a central authority, while gracefully recovering from failures, and regular hot code loading. Getting this wrong can lead to some hair pulling at 2am.</p>
<p>Our ecosystem has some of the strongest eventual consistency tooling: consider the EEF working group <a href="https://github.com/OpenRiak" rel="noopener nofollow ugc">OpenRiak</a>, probably the most production-hardened EC system in the BEAM.</p>
<p>It’s also possible to get EC semantics without a separate database with <a href="https://github.com/riak-core-lite/riak_core_lite" rel="noopener nofollow ugc">riak_core_lite</a>. You can get consistent hashing, vnodes, conflict resolution directly in an Elixir application. A different use case than OpenRiak, but worth mentioning.</p>
<p>That said, EC comes with tradeoffs. Namely, eventual consistency at the key-value level doesn’t automatically compose into consistency at the application level. I’ve personally misused EC in the past, suffered the consequences (invariant violations), and landed on strict serializability systems to recover.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="384036" 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/dgen-a-distributed-genserver/74409/19">Post #18</a>
	                </div>
	            </div>
              <div id="likers-container-384036" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="384036"
                     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 #18"></div>
  </section>
</div>
    <div class="postbit" id="384069" data-post-id="384069">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I don’t think I can recall the exact specifics, but it was something like this:</p>
<ul>
<li>Each patient gets a unique process</li>
<li>Each process is replicated 3 or more times across nodes</li>
<li>The Master location for each process was determinable by some sort of filter (bloom??) or hashing function.</li>
<li>Any node could independently work out what node should hold the master record using the same filter/function (so it was fully deterministic and didn’t rely on a shred lookup table)</li>
</ul>
<p>I really wish I had more details, because the system uses a genuinely unique architecture that seems to be working incredibly well.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="384069" 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/dgen-a-distributed-genserver/74409/20">Post #19</a>
	                </div>
	            </div>
              <div id="likers-container-384069" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="384069"
                     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 #19"></div>
  </section>
</div>
    <div class="postbit" id="384280" data-post-id="384280">
  <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>Ah, I see we have QuiCK at home <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"></p>
<p>I wrote this somewhere before, but the funny thing about quick is it’s not interesting at all. Apple just implemented the dumbest possible queue on top of a really, really good database.</p>
<p>The hard part of implementing something like a quick queue is keeping the multi-level index in sync. Except it’s not hard at all, because you can literally just write the two completely disparate index rows <em>along with the user data</em> in a single atomic transaction with perfect consistency, with zero effort, because FDB. That is the power of actually taking the time to design a system with useful guarantees.</p>
<aside class="quote no-group" data-username="jstimps" data-post="7" data-topic="74409">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jstimps/48/37213_2.png" class="avatar"> jstimps:</div>
<blockquote>
<p>Even still, how do we generalize versionstamps and watches? - an open question.</p>
</blockquote>
</aside>
<p>I mean I don’t speak for anyone else, but I’ll probably generalize versionstamps by just implementing them exactly like FDB because they’re pretty good. For a literally-serialized system like SQLite any counter will do.</p>
<p>Watches are bad, though.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="384280" 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/dgen-a-distributed-genserver/74409/21">Post #20</a>
	                </div>
	            </div>
              <div id="likers-container-384280" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="384280"
                     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 #20"></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/74409/load_more?page=3">Load more posts (21 remaining)</a>
</div></template></turbo-stream>