From 960a68c8ccb76e4b39af023c4e95a7da20632b93 Mon Sep 17 00:00:00 2001 From: Sergey Fedorov Date: Sun, 11 Aug 2024 17:46:08 +0200 Subject: [PATCH] Add blog post on distributed protocol frameworks The post concludes the exploration of frameworks for implementing distributed protocols. Signed-off-by: Sergey Fedorov --- .../image.png | Bin 0 -> 135132 bytes .../index.mdx | 169 ++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 blog/2024-08-27-on-frameworks-for-implementing-distributed-protocols/image.png create mode 100644 blog/2024-08-27-on-frameworks-for-implementing-distributed-protocols/index.mdx diff --git a/blog/2024-08-27-on-frameworks-for-implementing-distributed-protocols/image.png b/blog/2024-08-27-on-frameworks-for-implementing-distributed-protocols/image.png new file mode 100644 index 0000000000000000000000000000000000000000..f532f7e54daea30d32a884262bd1e8043a442b33 GIT binary patch literal 135132 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 Axc~qF literal 0 HcmV?d00001 diff --git a/blog/2024-08-27-on-frameworks-for-implementing-distributed-protocols/index.mdx b/blog/2024-08-27-on-frameworks-for-implementing-distributed-protocols/index.mdx new file mode 100644 index 0000000..b95ab6e --- /dev/null +++ b/blog/2024-08-27-on-frameworks-for-implementing-distributed-protocols/index.mdx @@ -0,0 +1,169 @@ +--- +title: On Frameworks for Implementing Distributed Protocols +description: A post concluding exploration of 7 frameworks for implementing distributed protocols. +authors: sergefdrv +tags: ["technical", "overview", "long"] +image: "./image.png" +--- + +This post concludes the second phase of the [state-of-the-art exploration](https://github.com/replica-io/replica-io/issues/7) in the scope of milestone [M0.1](https://github.com/replica-io/replica-io/milestone/1) of the Replica_IO project, namely exploration of existing frameworks for implementing distributed protocols. It shares the main conclusions drawn from exploring 7 different frameworks. + + + + +:::note + +A companion video is available [here](https://youtu.be/oRQG6EBzVe4). + +::: + + +## Exploring Distributed Protocol Frameworks + +Trying to make a real breakthrough, such as what the Replica_IO project aims at, it is important to learn from prior attempts to deal with the problem. Having explored how real-world code bases typically implement the core distributed protocols like consensus and having summarized the findings in [the previous post](https://replica-io.dev/blog/2024/03/04/on-implementation-of-distributed-prtocols), I continued the exploration by surveying existing attempts to find a better approach to the problem, i.e. different frameworks for implementing distributed protocols. + +I looked at the documentation and examples provided by each of the frameworks, as well as into their implementation, in order to figure out how they model and structure distributed systems, what kind of notation is used to specify and implement distributed protocols in those frameworks, what is their approach to communication, concurrency, and composition of protocol components, and what they offer for ensuring the correctness of protocols and their implementations. + +After having explored each of the frameworks, I summarized and shared some of my findings. You can find those overviews on [this wiki page](https://github.com/replica-io/replica-io/wiki/State-of-the-art-exploration). + +Here is the full list of 7 frameworks, based on different programming languages, that I explored[^other-frameworks]: + - [Mir](https://github.com/consensus-shipyard/mir) — a framework for implementing, debugging, and analyzing distributed protocols (based on Go); + - [Atlas](https://github.com/SecureSolutionsLab/Atlas) — a modular framework for building distributed mechanisms focused on configurability and performance (based on Rust); + - [Babel](https://github.com/pfouto/babel-core) — a generic framework for implementing and executing distributed protocols (based on Java); + - [DiStaL](https://distal.github.io/) — a framework for implementing and executing distributed protocols (based on Scala); + - [PSync](https://github.com/dzufferey/psync) — a framework for implementing and verifying fault-tolerant distributed protocols (based on Scala); + - [Diesel](https://github.com/DistributedComponents/disel) — a framework for implementation and compositional machine-assisted verification of distributed systems and their clients (based on Coq); + - [Verdi](https://github.com/uwplse/verdi) — a framework for implementing and formally verifying distributed systems (based on Coq). + +[^other-frameworks]: If you know of some other framework for implementing distributed protocols that I should have looked into, please let me know. + +In the subsequent sections, I will share some of the observations and conclusions I made while exploring those frameworks. I decided to structure the discussion around the following aspects: + - _model_: how distributed systems and their components are modeled; + - _structure_: how distributed protocol components are structured and composed together; + - _notation_: what kind of notation is used to specify and implement distributed protocols; + - _operation_: how distributed protocol components are executed and interact with each other; + - _verification_: how distributed protocols and their implementations are verified for correctness. + +But before we go into details, I would like to note that most of those frameworks were purely academic efforts and almost all of them seem to be abandoned now; unfortunately, they didn't seem to have found practical use. Nevertheless, it was good to learn from them. Let's now dive in. + +## Model + +The way that systems and their components are modeled has a profound effect on the structure and shape of their specifications and implementation, on the operational aspects and verification for correctness. We can consider different levels of abstraction when modeling distributed systems: the high-level model of the system as a whole, the model of individual nodes within the system, as well as individual protocols and components within the nodes. Let's take a look at how the explored frameworks model distributed systems and their components. + +The common approach is to model distributed systems at high level as [state transition systems](https://en.wikipedia.org/wiki/Transition_system) where the global system state changes upon external and internal events, such as client requests, messages exchanged within the system, and timeouts. In this model, the global system state includes the states of all individual nodes and their components, as well as the environment state. The environment state usually includes the state of the network the nodes communicate through, in particular the messages in transit. Transitioning from one state to another happens according to a global _transition function_ triggered by events. The transition function receives the current state of the system together with the triggering event and returns the new system state. + +The explored frameworks follow the [message-passing](https://en.wikipedia.org/wiki/Message_passing) approach, where the states of individual nodes and protocol components are disjoint, i.e. different parts do not share pieces of state. Interaction between nodes happens through the network by sending and receiving messages. Sending and receiving of messages are modeled as events modifying the global system state by updating the set of messages in transit in the network state and, in case of message receiving, the state of the target component in the destination node. For example, in Diesel, the system state includes a "message soup" for each protocol, which models the current state and the history of the network. In Diesel's abstract model, messages are never removed from the message soup, instead they are marked either as active or consumed. + +Nodes and network failures are modeled as special events, e.g. dropping or duplicating messages in the network, disabling normal event handling in faulty nodes or (partially) resetting their state. Some of the frameworks only consider crash faults, leaving [Byzantine faults](https://en.wikipedia.org/wiki/Byzantine_fault) for the future work. The system models in most of the frameworks do not seem to include timing assumption, so they can be considered asynchronous. In contrast, PSync employs the Heard-Of model based on communication-closed rounds, which provides an illusion of simple synchronous communication on top of the partial synchrony of the actual underlying network. In this model, protocol execution proceeds in explicit rounds, alternating communication with protocol state transition based on the set of messages received during the round. Network and node faults in this model are unified, and the network assumptions are specified in terms of the heard-of sets. + +Communication between nodes is predominantly modeled as fire-and-forget message delivery, where messages can be reordered or dropped by the network abstraction. Though, in Verdi, protocols are first modeled with an idealistic, reliable network semantics, which can then be translated into weaker fault models using verified system transformers. Babel allows modeling protocols in stronger communication models using communication channel abstractions, which represent communication mechanisms with different properties and guarantees. + +Individual components within nodes are commonly modeled as sequential, event-driven state machines interacting with each other via reliable message passing. The message passing normally follows the one-to-one one-way or request-response patterns; however, some of the frameworks also support one-to-many notifications between components. Some frameworks (e.g., Verdi) explicitly distinguish between the events that are external to the distributed protocol, like client requests, and internal events, like exchanging messages between protocol components and nodes within the distributed system. + +To overcome the limitations of strict state separation between protocol components in the abstract model, Diesel allows coupling protocols via inter-protocol behavioral dependencies, called send-hooks, which allow restricted logical access to other protocol's state. Diesel doesn't seem to strictly follow the message-passing model for protocol components within the same node, supporting generic composition of protocol components. Diesel also provides mechanisms to establish stronger properties of protocols and their combinations by strengthening them with additional inductive invariants. + +As we can see, although there are some interesting variations and extensions, the underlying system model in the explored frameworks is largely the same, namely the one of a state transition system composed of components, which are sequential, event-driven state machines with disjoint state, interacting via message passing. This is remarkably similar to how distributed protocols are usually implemented in real-world code bases, which do not use any framework, as I described in [the previous post](https://replica-io.dev/blog/2024/03/04/on-implementation-of-distributed-prtocols). This approach tends to shift the focus more to the operational rather than functional and logical aspects of the system. There I also pointed out, when discussing how protocol implementations attempt to [evade concurrency](https://replica-io.dev/blog/2024/03/04/on-implementation-of-distributed-prtocols#evading-concurrency), that this approach may complicate the implementation and cause fragmentation of the protocol logic. Perhaps, adopting the same kind of the underlying model is one of the reasons why the explored frameworks do not seem to have made a real breakthrough in designing and implementing distributed protocols. + +## Structure + +In all of the explored frameworks, protocol implementations rely on some kind of runtime or shim provided by the framework, hiding low-level concerns from implementation of the protocol logic. In most of the frameworks, the runtime is responsible for coordinating the execution of protocol components and interaction between them; some of the frameworks also provide there dedicated interfaces for communication over the network and setting timers. Protocol components normally need to be registered within the runtime before they can function within the system. + +In most cases, protocol components within the same node can interact by simply sending some kind of internal messages to each other, without establishing any explicit connection. In contrast, components in Atlas require explicit orchestration of the interaction with the rest of the system. Diesel instead supports composition of components expressed as effectful functional programs; it also allows loosely coupling protocol components via inter-protocol behavioral dependencies, called send-hooks, at the formal specification level. + +Since the runtime in Mir is only responsible for coordinating the execution of protocol components and interaction between them, there are special components that provide functionality for sending and receiving messages over the network, as well as for setting local timers and for cryptographic operations. Mir explicitly distinguishes between passive components, which can only produce events synchronously, as a result of processing input events provided by the runtime, and active components, which can asynchronously produce new events on their own. + +There are frameworks that provide means for enhancing protocol components with additional properties. Diesel provides a protocol combinator `ProtocolWithIndInv`, which allows elaborating a protocol by strengthening it with additional inductive invariants. Verdi provides verified system transformers, which allow transforming protocols specified, implemented, and verified in an idealistic, reliable network semantics into an equivalent implementation, preserving the transformed system properties under a weaker fault model. PSync provides a class, which can be used to wrap protocol round instances to support updating progress conditions and synchronizing rounds in a Byzantine setting. + +There are two main approaches to structure interaction of distributed protocols with the rest of the application. Some frameworks provide a mechanism for interacting with protocol components by sending and receiving messages, same as protocol components interact with each other. Other frameworks allow defining dedicated interfaces for that purpose, featuring callable methods or special IO events. In some of the frameworks, protocol components are supplied with some kind of handles to trigger side effects, such as sending messages or setting up timers; in other frameworks, side effects only happen after returning the control back to the runtime, e.g. through the return value or using a monadic structure. + +Protocol components commonly consist of the component's state and protocol logic structured as handlers modifying the state or state transition functions, which are triggered by the runtime upon certain events or conditions. In Distal and Diesel, the handlers/transitions can be augmented with guarding conditions that must hold in order to trigger the action. + +The round-based model in PSync imposes a particular structure of protocol components. Protocol components in PSync must specify a sequence of protocol rounds. Each round, in general, consists of methods to: initialize the round, send messages at the beginning of the round, process received messages, and finally update the internal state before transitioning into the next round. + +PSync and Diesel explicitly separate the protocol specification from its implementation, whereby the specification is used to formally verify the implementation. Protocol specifications in PSync consist of protocol properties, as well as safety and liveness predicates (assumptions). In order to aid automated verification in PSync, the specification should also include round and/or phase invariants; round transition relations are automatically derived from the code, although this imposes certain limitations on the code. In Diesel, high-level abstract protocol specifications are defined in terms of state-space coherence predicates and send/receive transitions. + +The configuration of protocol components within nodes and their internal structure can be more static or dynamic. For example, in Babel, protocol components and various components' callbacks are registered within the runtime dynamically. The configuration of top-level components in Mir is rather static, for it cannot be changed after initialization, but there is a special component, called factory module, that supports creating sub-components dynamically. Such flexibility at runtime can make formal verification particularly hard, so the frameworks focused on formal verification (PSync, Diesel, and Verdi) tend to be rather static with respect to the configuration and internal structure of protocol components. + +Overall, the abstract model adopted by a framework, e.g. the model of a generic state transition system with message-passing or the Heard-Of model based on communication-closed rounds, largely determines how protocol specifications and implementations are structured within the framework. The framework's features like formal verification can add further restrictions, e.g. restricting runtime flexibility of the configuration and internal structure of protocol components. + +## Notation + +All of the explored frameworks use the general-purpose programming language they are based on as the primary means for expressing protocol implementations. To enhance ergonomics and expressiveness, most of the frameworks introduce some notational extensions, e.g. elements of an embedded domain-specific language (eDSL). + +Using a regular general-purpose programming language as the basis allows tapping directly into the comprehensive features of the language, such as the type system, polymorphism, inheritance, and metaprogramming. On the other hand, implementing protocol components in regular code can produce some undesirable effects such as nondeterminism, e.g. when iterating over built-in unordered data structures, which is problematic for reproducible simulation-based testing. For that reason, Mir provides some utility functions that should be used in place of usual idiomatic code to avoid that kind of nondeterminism. Rich expressiveness of general-purpose languages can also make automatic verification difficult, e.g. PSync is quite limited in what kind of Scala constructs it supports in automatic derivation of transition relations from the code. + +In most cases, the notational extensions introduced by the frameworks serve to make the code more declarative and concise. One target of such enhancements is providing a convenient and clear way of expressing the typical event-oriented pseudo-code notation with `upon` statements. For example, the protocol logic in Distal is implemented by defining rules and the corresponding actions, whereby the rules are expressed in a declarative style resembling typical pseudo-code found in the literature and specify event predicates, such as the message type and matching conditions, as well as the means to specify composite events, which are triggered by collections of messages. + +Another area of applying notational enhancements is for expressing certain actions performed by the protocol logic and overcoming the limitations of the host language. For example, Distal provides a special notation for sending messages, discarding received messages, as well as for scheduling actions to be executed in future. Diesel extends Coq's specification language Gallina with effectful commands (actions), such as sending and receiving messages, reading from local state, monadic sequential composition, and general recursion. For message sending and receiving actions, Diesel provides transition wrappers, which lift low-level operations on the networking layer to the level of well-typed program primitives corresponding to the protocol specification. Similarly, Verdi provides a monad for expressing the actions of sending messages, emitting output event, and manipulating the current state, as well as convenience notation for various monadic bindings. + +Finally, expressing protocol properties, assumptions, and invariants, as well as the related annotations in the protocol implementation can also benefit from notational enhancements. PSync, for instance, defines a DSL for expressing properties, predicates and invariants, in which one of the main primitives is the notion of domain, representing a set of values of certain type with universal and existential quantification defined for it, as well as set comprehension. Diesel features a special notation for representing the higher-order Hoare types of program fragments. + +Many elements of a DSL can be implemented using common programming language techniques like polymorphism, inheritance, composition, higher-order functions, and the type system features. This way, Distal implements most of its DSL as ordinary methods and convenience aliases. However, this approach has certain limitations, and such techniques as metaprogramming (macros) or code generation are often required. For instance, in Distal, the key element of the DSL is implemented as a macro; in PSync, automatic derivation of transition relations from the code is also implemented as a macro. Code generation in Mir reduces the amount of hand-written boilerplate code by processing Protobuf definitions annotated with special extensions. Diesel and Verdi take advantage of Coq's syntax extension features. + +Clear and convenient notation for defining protocol specifications and their implementation is crucial for ergonomics and expressiveness. Building upon ordinary code, clever use of common programming language techniques, such as polymorphism, inheritance, composition, higher-order functions, and the type system features, should be the preferred approach for achieving notational expressiveness. Such techniques as metaprogramming and code generation can greatly help overcoming the limitations of that approach or further improving the notation, but they can make the framework more complicated and, therefore, should be employed judiciously. + +## Operation + +In terms of operation, the core part in most of the frameworks is some kind of runtime or engine that orchestrates the execution of protocol components and their interaction. For concurrent execution of protocol components, the runtimes mostly rely on conventional concurrency mechanisms used in the corresponding language's ecosystem, such as goroutines in Go and execution pools in Java and Scala. Atlas, notably, is based on native OS threads rather than an async Rust runtime like Tokio, presumably due to a performance overhead of the latter. + +There are two main approaches to implementing interaction based on message-passing between protocol components and with the networking layer: using a central event dispatching loop or through explicit channels established between components. Mir is a good example of the former approach, whereas Atlas follows the latter one. Since different protocol components normally operate asynchronously, there is often some kind of event queue or buffer placed between the components to accommodate for the asynchrony. + +This raises an issue of preventing unbounded growth of those queues. Mir addresses this problem by temporarily blocking the influx of external events from active modules when the amount of events buffered in internal queues exceeds certain thresholds. Atlas relies on flow control provided by bounded buffered channels for communication between components. + +In general, garbage collection issue is an important aspect of operation in distributed protocol implementations. Sometimes it can happen automatically, e.g. in PSync, received message sets are automatically discarded by the runtime upon transitioning into a new round. However, in some cases, it requires special care. For example, in Distal, protocol components should explicitly discard automatically buffered messages that become irrelevant for further execution of the protocol, in order to avoid unbounded growth of state and slowing down evaluation of rules. In Mir, there is an interesting pattern for performing garbage collection of internal component's state, whereby each disposable piece of state is assigned a numerical retention index, and the component removes the pieces of state whose retention index is below a specified value upon processing a dedicated garbage collection event emitted by another component. + +Communication between nodes in most of the frameworks is implemented in a simplistic manner, providing best-effort message delivery, following the fire-and-forget communication style. Babel is a notable exception, since it introduces a notion of communication channel abstraction, where different channel types can represent different communication mechanisms with different properties and guarantees, e.g. more reliable message delivery, multiplexing connections, and φ-accrual failure detection. + +So orchestrating the execution and coordinating interaction of protocol components often require some kind of runtime provided by the framework. The runtime should take care of asynchrony, garbage collection, communication, and coordination within the node, preventing unbounded growth of internal state and ensuring good performance. + +## Verification + +Not all of the explored frameworks are concerned with verifying correctness of protocols and their implementations. Verification is the primary area of focus for Diesel and Verdi, as well as PSync. Verification is not a major concern in Mir, though it provides some mechanisms that can be considered as lightweight verification of protocol implementation correctness. + +Mir includes support for recording, inspecting, modifying, and replaying traces of events being passed by the node engine between the components, which can be very helpful for debugging, but also to perform correctness analysis. Mir also comes with a simple discrete-event simulation runtime that can be used for randomized reproducible testing with simulated time. + +Full-fledged formal verification of protocol specifications and implementation in Diesel and Verdi relies on machine-assisted theorem proving, whereas PSync attempts to automate the process. Theorem proving, even if machine-assisted, is a very difficult, time consuming task and requires special expertise. Automated verification, on the other hand, is in general undecidable and can only be achieved with certain restrictions to the system model and the protocol implementation. + +Formal verification requires formal specification of the assumptions and the required properties. In Diesel, protocol specifications are defined in terms of state-space coherence predicates and send/receive transitions. In Verdi, the correct behavior of the protocol is specified as a logical predicate over its possible traces of events. Formal specifications in PSync are expressed in terms of protocol properties, expressed in a fragment of a first-order temporal logic, as well as safety and liveness predicates (assumptions), expressed in terms of cardinalities of heard-of sets. + +In these frameworks, the method of formally proving the correctness is typically by induction, constructing inductive state invariants. Coming up with appropriate inductive invariants constitutes the greatest difficulty in the verification effort and requires special skills. + +In PSync, the simple round-based structure with lock-step semantics makes protocol implementation amenable to automated verification that can check safety and liveness properties. The verification, though, requires inductive invariants at the boundaries between rounds. However, the automated verification problem is decidable with certain constraints. + +The correctness of protocol implementation in Verdi is proved directly, whereas Diesel employs a different approach. For implementing protocol specification, Diesel provides a DSL, embedded shallowly into Coq, that extends Coq's specification language Gallina. Diesel programs and their fragments are assigned types corresponding to the protocol specification in higher-order separation-style Hoare logic. For message sending and receiving actions, Diesel provides transition wrappers, which lift low-level operations on the networking layer to the level of well-typed program primitives corresponding to the protocol specification. Well-typed programs are guaranteed to be _correct by construction_ w.r.t. the protocol specifications. + +In Verdi, once the protocol is specified, implemented, and verified in an idealistic reliable network semantics, it can be translated using _verified system transformers_ into an equivalent implementation, preserving the transformed system properties under a weaker fault model. + +in Diesel, protocol specifications can be generic and parameterized. The generic protocol specifications with their proven invariants can be used in composition. Diesel provides mechanisms to establish stronger properties of generic protocols and their combinations by elaborating the protocol, i.e. strengthening it with additional inductive invariants. + +Correctness is very important for the critical fault-tolerant protocols; therefore, the verification aspect deserves special attention. There are relatively easy-to-apply lightweight methods, such as randomized reproducible testing with discrete-event simulation, and there are sophisticated formal methods typically requiring special skills and expertise, such as machine-assisted theorem proving. However, some particularly structured system models may enable automated reasoning and make formal verification more practical, though at the cost of additional limitations. + +## Conclusions + +Having explored these 7 frameworks for implementing distributed protocols, I found most of them not sufficiently developed for practical use, though some of the ideas and techniques employed there were worth exploring. Being purely academic efforts, most of the frameworks seem to have been abandoned after exploring some ideas and publishing the results. As of time of this writing, Mir is perhaps the most mature, well documented, and up-to-date one among these frameworks. + +Focusing on some particular aspects of implementing distributed protocols, such as unifying and standardizing components, testing and debugging, notational convenience, or formal verification, while mostly neglecting the remaining aspects, may be appropriate for academic research, but this is certainly not sufficient for achieving practical adoption. Moreover, the programming languages that most of the frameworks are based on would make it hard to integrate the protocol implementations directly into larger code bases written in other languages, let alone that having to learn a less commonly used language like Scala or Coq is an additional obstacle for adoption. Please refer to the [previous post](https://replica-io.dev/blog/2024/03/04/on-implementation-of-distributed-prtocols) about practical aspects of implementing distributed protocols. + +Most important, perhaps, is that all of the frameworks seem to basically adopt the same model of a state transition system and trying to mimic the event-oriented notation as found in typical pseudo-code with `upon` statements in the literature on distributed protocols. This largely impacts how protocol implementations are expressed and structured in those frameworks. + +I believe, if we want to make a real breakthrough in _both designing and implementing_ distributed protocols, which is what the Replica_IO project is about, then we should first of all be innovative, challenging the status quo, and think holistically, taking into account all relevant aspects. Trying to rethink the conventional distributed system model and the way of expressing distributed protocols would be a good start. + +## Next Steps + +Having explored some distributed protocol implementations and frameworks for implementing distributed protocols, now it is a good time to clearly state the problems in designing and implementing distributed protocols to focus on for the rest of milestone [M0.1](https://github.com/replica-io/replica-io/milestone/1) and start gathering ideas on how we could approach them. Apart from that, there are still some potentially related concepts, approaches, and techniques worth looking into as part of the initial state-of-the-art exploration. The exploration tasks are tracked in the scope of [this issue](https://github.com/replica-io/replica-io/issues/7) on GitHub. + +Once the initial exploratory stage is over, it will be time to come up with key ideas concerning core principles that will guide the process of designing and implementing generic components within the framework (milestone [M0.1](https://github.com/replica-io/replica-io/milestone/1)). Then those ideas will be developed into clearly formulated concepts (milestone [M0.2](https://github.com/replica-io/replica-io/milestone/2)), their feasibility will be verified with code (milestone [M0.3](https://github.com/replica-io/replica-io/milestone/3)). After that, prototype, MVP, and production versions of the framework will be developed and released (milestones [M1](https://github.com/replica-io/replica-io/milestone/4), [M2](https://github.com/replica-io/replica-io/milestone/5), and [M3](https://github.com/replica-io/replica-io/milestone/6)). + +It does not mean at all that exploration, ideation, and prototyping will not take place at later stages; the milestones simply define the framework's general level of maturity. The framework will continuously evolve and expand and at some point become a de facto standard for implementing critical fault-tolerant systems providing a growing collection of easy-to-use reliable and efficient distributed replication mechanisms. + +import Admonition from '@theme/Admonition'; + + +If you like the project and find it valuable, please support its further development! 🙏 + + +:::note + +If you have any thought you would like to share or any question regarding this post, please add a comment [here](https://github.com/orgs/replica-io/discussions/43). You are also welcome to [start a new discussion](https://github.com/orgs/replica-io/discussions/new) or chime in to [our Discord](https://discord.replica-io.dev/) server. + +:::