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


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I’m also considering an asynchronous approach, which might break some of the OP’s constraints.</p>
<p>My application already generates UUIDs for persisted documents, but we now want to additionally generate sequential IDs in the form of monotonically incrementing integers. Occasional gaps are permissible but collisions are not. I’m not using postgres as a storage backend and would prefer not to introduce it for just this purpose.</p>
<p>So I’m considering 2 different approaches:</p>
<ol>
<li>Use Swarm to manage <code>Counter</code> processes, dumping state to e.g. S3 on shutdown</li>
<li>Enqueue an event to asynchronously generate the integer ID after document creation</li>
</ol>
<p>The tradeoff to option 1 is <code>Counter</code>s scale linearly with document types, and S3 failures (though unlikely) would be borderline unrecoverable. Option 2’s big downfall, IMO, is that we’d have to accept eventually consistent IDs.</p>
<p><code>:ets</code> interests me as a possibility, but I don’t have much experience with it. I’m wary of any gotchas in a distributed setting</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="215115" 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/best-way-to-generate-sequential-ids/33241/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-215115" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="215115"
                     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="215118" data-post-id="215118">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>If the OP cannot tolerate occasional gaps then it is a hard problem indeed.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="215118" 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/best-way-to-generate-sequential-ids/33241/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-215118" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="215118"
                     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 #12"></div>
  </section>
</div>
    <div class="postbit" id="215932" data-post-id="215932">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="emoragaf" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/emoragaf/120/4384_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  emoragaf
                    <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>we actually went that exact same route, we have a process per product on a libcluster+swarm cluster<br>
we can ask for the next id in the sequence to those processes</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="215932" 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/best-way-to-generate-sequential-ids/33241/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-215932" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="215932"
                     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="216095" data-post-id="216095">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I did the same thing, it’s good-enough and actually quite simple. I’ll elaborate in case anyone’s curious <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 have a function <code>SequentialID.get_and_increment(tag)</code> that roughly:</p>
<ol>
<li>Ensures a <code>SequentialID.Counter</code> GenServer process is started under a DynamicSupervisor</li>
<li>The Counter process fetches the integer ID value in <code>init/1</code> from a pluggable storage backend</li>
<li>The Counter process is <code>call</code>’d to increment the counter, put it in the storage backend, and reply with it</li>
</ol>
<p>The Counter process is named via <a href="https://hexdocs.pm/swarm/readme.html" rel="noopener nofollow ugc">Swarm</a>, e.g. <code>{:via, :swarm, {SequentialID.Counter, "my-tag"}}</code> to ensure only one instance of the process is started in the cluster, per tag. Forming a dynamic cluster is easy to do with <a href="https://hexdocs.pm/libcluster/readme.html" rel="noopener nofollow ugc">libcluster</a>.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="216095" 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/best-way-to-generate-sequential-ids/33241/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-216095" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="216095"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>