<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="385884" data-post-id="385884">
  <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>Yeah, I agree that your post was on-topic. It was automatically hidden when it received a number of flags from regular users. In any way, this forum doesn’t have a rule which says “You can’t write or edit posts with help of AI”, and I hope that moderators will make it visible once they have time to review 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="385884" 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/ferricstore-a-durable-redis-compatible-cache/74820/23">Post #22</a>
	                </div>
	            </div>
              <div id="likers-container-385884" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="385884"
                     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="385888" data-post-id="385888">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>A few days ago we updated the flag system after having changed the post composition tip to the following a few weeks ago:</p>
<blockquote>
<p>Type here. Use Markdown, BBCode, or HTML to format. Drag or paste images. Please use your own words (no AI slop please).</p>
</blockquote>
<p>The flag system:</p>
<blockquote>
<p><strong>It’s AI Generated</strong></p>
<p>Using AI as a smart dictionary, thesaurus, or translator is ok - using AI for content composition (or posting anything that looks like it) is not.</p>
</blockquote>
<p>We’ve been monitoring AI generated posts in a log since Feb of last year and determined this is the best way forward for now.</p>
<p>If people want to post AI generated text/conversations, then the new section we created last year may be a good fit as it would ensure the flow of the main thread remains in line with expectations/the norm: <a href="https://forum.elixirforum.com/t/new-ai-conversations-section/72455" rel="nofollow">https://forum.elixirforum.com/t/new-ai-conversations-section/72455</a> (we could probably update those guidelines now).</p>
<hr>
<p>To the OP, you should be able to edit the post and submit a new version (just please make sure it’s in your own words - translated to English with the help of an AI is fine if need be).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="385888" 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/ferricstore-a-durable-redis-compatible-cache/74820/24">Post #23</a>
	                </div>
	            </div>
              <div id="likers-container-385888" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="385888"
                     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="385935" data-post-id="385935">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>It would be interesting to know how does it compare with KvRocks in terms of write &amp; read performance. For the moment I have not found another K/V db that supports disk persistent that is faster.</p>
<p><a href="https://github.com/apache/kvrocks" class="onebox" target="_blank" rel="noopener nofollow ugc">https://github.com/apache/kvrocks</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="385935" 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/ferricstore-a-durable-redis-compatible-cache/74820/25">Post #24</a>
	                </div>
	            </div>
              <div id="likers-container-385935" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="385935"
                     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="385943" data-post-id="385943">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="yoavgeva" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/yoavgeva/120/39979_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  yoavgeva
                    <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>I didn’t run benchmark yet, because it’s not fully ready, so I can’t say numbers, I will tell you the arch comparison between both:</p>
<ul>
<li>Storage engine
<ul>
<li>Ferricstore - uses Bitcask - an append-only log, every key location is always known, making every cold read O(1)</li>
<li>Kvrocks - uses RocksDB - an LSM-tree. Reads traverse bloom filters → index blocks → data blocks across multiple levels. making every cold read O(log N)</li>
</ul>
</li>
<li>Memory &amp; Read Path
<ul>
<li>Ferricstore -  has 2 tiers - ETS (hot, in-process hash table) → Bitcask on disk (cold)</li>
<li>Kvrocks - even with a warm block cache, every lookup still traverses bloom filter → index block → data block — it’s a cache of disk structures, not a native hash table</li>
</ul>
</li>
<li>Write Path
<ul>
<li>Ferric store has 2 modes
<ul>
<li>quorum mode - which mean shard leader write to majority and he wait until all written and ACK by majority of nodes</li>
<li>Async mode - shard leader save in ram send ack and than replace and write in disk</li>
</ul>
</li>
<li>KV rocks has only async, write to ram send ack to client than write to flush to disk</li>
</ul>
</li>
<li>Write concurrency
<ul>
<li>Ferricstore - Write in parallel across shards ( one shard per cpu) - this works with today NVMe which allow this to work - each shard has it’s own directory/files</li>
<li>KV rocks - has multi threads but the write to disk is only one thread  - even if they adapt to modern name they will need to change the arch to allow it</li>
</ul>
</li>
<li>Read concurrency (Hot Path)
<ul>
<li>ferric store - lock-free ETS per shard</li>
<li>KV rocks - uses partitioned index/filter blocks which splits the cache into shards with independent locks, reducing contention. But it’s still a shared structure with locking.</li>
</ul>
</li>
<li>Replication Model
<ul>
<li>ferric store - Raft — all nodes in every shard’s group</li>
<li>kvrocks - Async master/slave per slot</li>
</ul>
</li>
<li>Machines for 3-shard HA
<ul>
<li>ferricstore- 3 total</li>
<li>kvrocks - 6 (3 masters + 3 replicas)</li>
</ul>
</li>
<li>Read scaling (add nodes)
<ul>
<li>ferric store - Automatic — every node serves local ETS reads</li>
<li>kvrocks - Manual — explicit replica routing required</li>
</ul>
</li>
<li>External dependencies (to manage a cluster)
<ul>
<li>ferric store - none</li>
<li>kv rocks - Controller + etcd / ZK / Consul</li>
</ul>
</li>
</ul>
<p>Both use Redis spec, which mean for read concurrency they are not optimized, because the spec is tuned for Redis which is one thread, which mean each command arrived must return in the same order per connection.</p>
<p>Ferricstore has embedded mode for elixir/erlang which also mean it is not limited by rspec, so I expect even higher concurrency there.</p>
<p>Need to remember that the numbers of the benchmark also depend on machines, runtimes, etc.., and I don’t understand how they help, because in usage you don’t only do set/get you do a lot more, you need more features that allow more different stuff to do, so for example maybe Redis will be faster for your kind of work, but other kind of work Ferricstore or kvrocks will be better and faster, well I do understand that benchmark help in marketing <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> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="385943" 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/ferricstore-a-durable-redis-compatible-cache/74820/26">Post #25</a>
	                </div>
	            </div>
              <div id="likers-container-385943" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="385943"
                     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="386114" data-post-id="386114">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Benchmarks do not just “help with marketing”. You are asking busy developers to trust your solution on production projects, but won’t bother to do up even a simple Benchee benchmark to compare lookup speeds against existing libraries?</p>
<p>FWIW  your library does target a very relevant use case for my day job, but I would not touch this with a 10 feet pole unless there is <em>some</em> effort made on code quality and performance assurance.</p>
<p>Some pointers:</p>
<ul>
<li>Your feature comparison table is against standalone caching components, which muddies the waters for your messaging on this as an Elixir library. There’s no comparisons against leading caching solutions like Cachex or Nebulex for example. Nor are there performance comparisons.</li>
<li>Going through your readme without using AI is critical if you sent to win developer trust. The writing style is too indicative of AI tendencies without any critical editing. Your readme could be half the size with double the effectiveness in messaging.</li>
<li>The standalone mode adds additional code and dependencies to the end user compilation, I would extract it out to a separate library if I were you.</li>
</ul>
<p>If you want your caching solution to succeed in the Elixir space and community, it also has to address the concerns raised in such threads critically, as some have probably hand rolled similar solutions to what you are building in some shape or form.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="386114" 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/ferricstore-a-durable-redis-compatible-cache/74820/27">Post #26</a>
	                </div>
	            </div>
              <div id="likers-container-386114" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="386114"
                     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="386122" data-post-id="386122">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="yoavgeva" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/yoavgeva/120/39979_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  yoavgeva
                    <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>I agree with what you said overall, I never said that I won’t benchmark, I will compare with all relevant products as you see fit, with your own tests if you want.</p>
<p>I am saying I don’t expect that the results will be amazing benchmark wise for example the result be 10-20% worse than the solution for one node, people usually choose products because of this, I am trying to give something product wise which is SLA of 99.99% with simplicity of setup and ops, this features come at a cost of performance.</p>
<p>I agree that I need to polish the readme, guides and code quality, it’s only the start, but it nice to hear from you that this kind of solution have some merit in today world, that’s what I was searching for.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="386122" 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/ferricstore-a-durable-redis-compatible-cache/74820/28">Post #27</a>
	                </div>
	            </div>
              <div id="likers-container-386122" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="386122"
                     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="391197" data-post-id="391197">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="yoavgeva" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/yoavgeva/120/39979_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  yoavgeva
                    <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>Hey everyone,</p>
<p>Small update from my side.</p>
<p>Current version is `0.7.1` on Hex:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">{:ferricstore, "\~&gt; 0.7.1"}
</code></pre>
<p>The repo also moved to the org repo:</p>
<aside class="onebox githubrepo" data-onebox-src="https://github.com/ferricstore/ferricstore">
  <header class="source">

      <a href="https://github.com/ferricstore/ferricstore" target="_blank" rel="noopener nofollow ugc">github.com</a>
  </header>

  <article class="onebox-body">
    <div class="github-row" data-github-private-repo="false">
  <img width="690" height="344" src="https://opengraph.githubassets.com/ebdcbdac695140f61c45c6fc528eb446/ferricstore/ferricstore" class="thumbnail">

  <h3><a href="https://github.com/ferricstore/ferricstore" target="_blank" rel="noopener nofollow ugc">GitHub - ferricstore/ferricstore: Durable KV and workflow state engine</a></h3>

    <p><span class="github-repo-description">Durable KV and workflow state engine</span></p>
</div>

  </article>

  <div class="onebox-metadata">
    
    
  </div>

  <div style="clear: both"></div>
</aside>

<p>The direction also changed a lot from the first post.</p>
<p>The biggest change is that I moved from the Redis/RESP wire protocol in the standalone server to the Ferric native protocol.</p>
<p>That was intentional, because I want to support both things better: durable KV / Redis-style data structures, and FerricFlow workflows.</p>
<p>FerricStore still has the KV/data-structure side. The goal is still to support the useful Redis-style primitives: strings, hashes, lists, sets, sorted sets, TTLs, counters, locks, rate limits and so on.</p>
<p>But the main promise is not “any Redis client can connect and everything is a Redis drop-in” anymore. The current promise is more like: FerricStore is a durable native store with Redis-style data structures, and FerricFlow adds durable workflows and queues on top.</p>
<p>The thing I am more excited about now is FerricFlow: durable workflows on top of the same store.</p>
<p>The reason I started to move there is that I wanted a high throughput workflow engine, and I didnt find the thing I wanted.</p>
<p>In many projects I always ended up using queues for everything. Queue for this, retry queue for that, delayed queue, dead-letter queue, some DB table for status, some script to repair stuck jobs. It works, but after a while the real system is not the queue anymore, it is all the workflow state you build around it.</p>
<p>What I wanted was something with the speed and simple worker model of queues, but with the workflow state built in from the start.</p>
<p>The things FerricFlow is trying to solve are the things I always see people build around queues:</p>
<p>- durable workflow state</p>
<p>- leases and fencing</p>
<p>- retries and retry exhaustion</p>
<p>- history and audit</p>
<p>- signals</p>
<p>- value refs for big payloads</p>
<p>- fanout / child workflows</p>
<p>- indexed workflow metadata</p>
<p>- retention and repair</p>
<p>- governance controls</p>
<p>The native protocol gives me more control on the things both sides need: request ids, multiplexing, routing, backpressure, typed SDKs, leader hints, ACL behavior, KV commands, and workflow specific commands.</p>
<p>So KV is still supported and important. The direction is FerricStore native protocol with Redis-style data structures + FerricFlow workflows.</p>
<p>I also started using the HA cluster in my own projects already. In my company we also started using it for small stuff, and the feedback until now is very positive. It is not me saying “this is finished 1.0 production database”, but it is also not only a toy repo anymore. I am dogfooding it in real places, and that is helping me see what need to be better.</p>
<aside class="onebox githubblob" data-onebox-src="https://github.com/ferricstore/ferricstore/blob/main/docs/benchmarks.md">
  <header class="source">

      <a href="https://github.com/ferricstore/ferricstore/blob/main/docs/benchmarks.md" target="_blank" rel="noopener nofollow ugc">github.com/ferricstore/ferricstore</a>
  </header>

  <article class="onebox-body">
    <h4><a href="https://github.com/ferricstore/ferricstore/blob/main/docs/benchmarks.md" target="_blank" rel="noopener nofollow ugc">docs/benchmarks.md</a></h4>

<div class="git-blob-info">
  <a href="https://github.com/ferricstore/ferricstore/blob/main/docs/benchmarks.md" rel="noopener nofollow ugc"><code>main</code></a>
</div>


      <pre><code class="lang-md"># Benchmarks

This page keeps only the latest public benchmark summaries. Raw benchmark logs and one-off profiling runs are intentionally not committed.

Use these numbers as reproducible reference points, not universal hardware claims. Throughput and latency depend on VM type, local NVMe availability, shard count, client concurrency, pipeline depth, payload size, and resource guards.

## FerricFlow: latest Azure runs

Workload shape:

```text
1,000,000 flows
single FerricStore server VM
single Python SDK client VM
Flow queue/workflow workers
live mode: create and process run together
```

The best balanced 16-vCPU server result was with 32 Flow shards.

</code></pre>



  This file has been truncated. <a href="https://github.com/ferricstore/ferricstore/blob/main/docs/benchmarks.md" target="_blank" rel="noopener nofollow ugc">show original</a>

  </article>

  <div class="onebox-metadata">
    
    
  </div>

  <div style="clear: both"></div>
</aside>

<p>The numbers that are published now are for FerricFlow workflow/queue workloads. On the Azure 16-vCPU runs, the best balanced 32-shard runs show roughly:</p>
<p>- `54,060` workflows/s end-to-end (3 states), in the workflow-worker benchmark shape</p>
<p>These are not universal numbers, only the result for this workload and hardware.</p>
<p>I still need to rerun KV SET/GET with the current native SDK/protocol before I publish latest KV numbers. I also want better Elixir-facing comparisons with what people actually use here: Cachex, Nebulex, ETS based caches, and DB backed solutions.</p>
<p>What changed in the current release line:</p>
<p>- KV/data structures are still supported through the Ferric native protocol and embedded API.</p>
<p>- The direction is Redis-style primitives, not Redis wire-protocol compatibility as the main promise.</p>
<p>- FerricFlow is now the main focus: durable workflows built into FerricStore.</p>
<p>- Flow state has leases, fencing, retries, history, signals, value refs, fanout, retention, and indexed metadata.</p>
<p>- There is now a governance layer for workflows:</p>
<p>- budgets</p>
<p>- human approvals</p>
<p>- external effect tracking</p>
<p>- distributed limits</p>
<p>- circuit breakers</p>
<p>- governance ledger/debugging</p>
<p>The governance layer is the part I think is most intresting now.</p>
<p>The problem is not only “how do I run a job later?”.</p>
<p>It is:</p>
<p>- should this work retry?</p>
<p>- how many times?</p>
<p>- how much budget can it spend?</p>
<p>- does a human need to approve the next step?</p>
<p>- did an external side effect already happen?</p>
<p>- should a circuit breaker stop this provider call?</p>
<p>- is one tenant using too much capacity?</p>
<p>- why did this workflow pause, fail, or get denied?</p>
<p>If you also have this pain in your projects, give it a try you might like 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="391197" 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/ferricstore-a-durable-redis-compatible-cache/74820/29">Post #28</a>
	                </div>
	            </div>
              <div id="likers-container-391197" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="391197"
                     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="391212" data-post-id="391212">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Can you clarify whether durable work flows in this case is truly durable between application / database restarts?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="391212" 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/ferricstore-a-durable-redis-compatible-cache/74820/30">Post #29</a>
	                </div>
	            </div>
              <div id="likers-container-391212" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="391212"
                     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="391221" data-post-id="391221">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="yoavgeva" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/yoavgeva/120/39979_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  yoavgeva
                    <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>Yes, this is what I mean by durable here.<br>
If any workflow command return success, the flow state was already written through FerricStore durable path before the ack.<br>
So if the app / worker restart, the workflow is still there.<br>
If FerricStore server restart, it should also recover the current flow state from the data dir / volume<br>
and rebuild the hot indexes / projections from the durable state.</p>
<p>Important details:</p>
<ul>
<li>current flow state is the source of truth</li>
<li>if worker dies while holding a lease, the flow is not lost</li>
<li>after lease expire / reclaim, another worker can claim it again</li>
<li>stale worker can’t complete old work because of lease / fencing tokens</li>
<li>FerricFlow does not replay your handler code like Temporal</li>
<li>external side effects still need idempotency keys</li>
</ul>
<p>The model is durable workflow state (imagine persistence state machine), not durable code replay.</p>
<p>One caveat: you need to run FerricStore with persistent data dir / docker volume / disk. If you run on<br>
tmpfs or delete the volume, of course there is nothing to recover from.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="391221" 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/ferricstore-a-durable-redis-compatible-cache/74820/31">Post #30</a>
	                </div>
	            </div>
              <div id="likers-container-391221" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="391221"
                     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>