<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.25 (Ruby 2.7.0) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-spinella-event-streaming-open-network-00" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.0 -->
  <front>
    <title abbrev="ESON">Event Streaming Open Network</title>
    <seriesInfo name="Internet-Draft" value="draft-spinella-event-streaming-open-network-00"/>
    <author initials="E." surname="Spinella" fullname="Emiliano Spinella">
      <organization>Syndeno</organization>
      <address>
        <email>emiliano.spinella@syndeno.com</email>
      </address>
    </author>
    <date year="2022" month="January" day="27"/>
    <area>TBD</area>
    <workgroup>TBD</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes the vision, architecture and network protocol for an Event Streaming Open Network over the Internet.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://example.com/LATEST"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-spinella-event-streaming-open-network/"/>.
      </t>
      <t>
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/syndeno/draft-spinella-event-streaming-open-network"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>1. Introduction</name>
      <t>Society is rapidly digitalizing and automating the exchanges of value that constitute the economy. Also, considerable time and energy is spent to assure that key transactions can be executed with reduced human involvement with better, faster, and more accurate results. In this context, Event Streaming can play a key role in how the economic system evolves.</t>
      <t>However, most of the application layer integrations executed today across organizational boundaries are not in real time. Also, they currently require employing a variety of formats and protocols. Some industries have adopted data formats for exchanging information between organizations, such as Electronic Data Interchange (EDI). However, those integrations are limited to specific use cases and represent a small fraction of all demanded organizational integrations.</t>
      <t>Thus, there is no consistent and common consensus on a mechanism for the exchange of events across organizations. This results in a completely custom landscape for each real-time cross-organization integration. In this scenario, development teams must invest plenty of time into understanding and defining a common interface for events exchange.</t>
      <t>In this context, we can now introduce how this landscape could change with the introductiopn of an Event Streaming Open Network over the Internet. When needing to connect real-time event flows across organizations, developers would have a common basis for finding, publishing, and subscribing to event streams. Also, given a set of standard formats to encode and transmit events, developers could use the programming language of their choice. Overall, this set of standards would drastically reduce the cost of real-time integration, which would also enable experimentation by users.</t>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
    </section>
    <section anchor="an-open-network-for-event-streaming-over-the-internet">
      <name>2. An Open Network for Event Streaming over the Internet</name>
      <t>In this section, we will argue how Internet standards are developed and why this could be the case for an Event Streaming Open Network.</t>
      <t>An interesting example of this phenomenon is the case of ISDN (Integrated Services Digital Network), a set of communications standards for the transmission of voice, video, and data over the PSTN (Public Switched Telephone Network) developed by the ITU-T (Telecommunication Standardization Sector) in 1988. ISDN pretended to use the existing public telephone network to transmit digital data in a time when the Internet connectivity access was not as broadly available as it is today. The main competitor of this standard was the incipient Internet itself, which could be used to transmit the same data.</t>
      <t>The Internet alternative needed a protocol to support the same services offered by ISDN, which was initially developed by the conjoint effort of the academic and private sector. Consequently, in 1992 the Mbone (Multicast Bone) was created. This project was an experimental network backbone built over the Internet for carrying multicast IP traffic, which could be used for multimedia content. After some important milestones of this project, the SIP (Session Initiation Protocol) was defined in 1996 and was published as a standard protocol in IETF's RFC-3261. The reality today is that SIP has completely won the standards battle for multimedia transmission over the Internet, and ISDN usage has been on continuous decline.</t>
      <t>As for Event Streaming, we see a similar scenario set-up today. There are currently several open specifications and implementations for Event Streaming, like AMQP (Advanced Messaging Queueing Protocol), supported by RabbitMQ. However, while AMQP can be used for several purposes, Kafka Protocol specializes on Event Streaming Processing and its specialized features make it more convenient than RabbitMQ (i.e. ordering).</t>
      <t>In the case of an Event Streaming Open Network over the Internet, if we guide ourselves by the history of the most widely adopted protocols on the Internet, the governance should be similar to that of the WWW or Email. Both the WWW and Email have open specifications as well as open-source implementations. We can mention the Apache Web Server as an open-source implementation of the HTTP protocol; Postfix for SMTP; and Bind for DNS. Nevertheless, the governance for these protocols' specifications relies on the IETF.</t>
      <t>In order to define the characteristics of an Event Streaming Open Network, we will focus on the definition of shared and openly accessible infrastructure. First, we will review the principles of Free, Open &amp; Neutral Networks and why they should be followed for an Event Streaming Open Network. Then, we will show how DNS complies with the criteria to be considered an infrastructure resource. Finally, we will demonstrate how this is also true for Event Streaming.</t>
      <section anchor="free-open-neutral-networks-fonn">
        <name>2.1. Free, Open &amp; Neutral Networks (FONN)</name>
        <t>The main principles of a Free, Open &amp; Neutral Network are:</t>
        <ul spacing="normal">
          <li>It is open because it is universally open to the participation of everybody without any kind of exclusion nor discrimination, and because it is always described how it works and its components, enabling everyone to improve it.</li>
          <li>It is free because everybody can use it for whatever purpose and enjoy it independently of his network participation degree.</li>
          <li>it is neutral because the network is independent of the contents, it does not influence them and they can freely circulate; the users can access and produce contents independently to their financial capacity or their social condition. The new contents produced are orientated to stimulate new ones, or for the network administration itself, or simply in exercise of the freedom of adding new contents, but not to replace or to to block other ones.</li>
          <li>It is also neutral with regard to the technology, the network can be built with whatever technology chosen by the participants with the only limitations resulting of the technology itself.</li>
        </ul>
      </section>
      <section anchor="non-discriminatory-and-open-access">
        <name>2.1.1. Non-discriminatory and open access</name>
        <t>Services such as DNS, the World Wide Web and Email do not discriminate and are open-accessible. Basically, people and organizations can access these networks as long as they can register an Internet Domain and host the required server components. Nowadays, there are alternatives to avoid having to register a domain name to have a web page or an email, such as Cloud WordPress Hosting or Gmail. However, we will focus on the network participants that provide services to end-users.</t>
        <t>In the case of Guifi.net, we can highlight how this principle has been adopted in the fact that everybody can take part in the project without discrimination. Moreover, an emphasis is made in easing the participation of the disadvantaged collectives, with less resources or less opportunities to access information technologies, telecommunications, and the Internet.</t>
        <t>An Event Streaming Open Network should provide resources in a similar way than the most widely adopted Internet Services. Thus, individuals and organizations must be able to register Flow address spaces for which the existing DNS infrastructure could be leveraged. Moreover, the specification of the protocols that implement the Metadata and Payload formats must also be openly accessible.</t>
      </section>
      <section anchor="open-participation">
        <name>2.1.2. Open participation</name>
        <t>Internet Services like DNS, WWW and Email provide individuals and organizations with different ways of participation. First, anybody can obtain the protocols' specification and build a custom implementation, which would result in a new product compatible with the protocols. Secondly, anybody can register a domain name and set up servers using compatible products. Thirdly, anybody can join and participate in the IETF, the institution that governs the specifications for these protocols.</t>
        <t>As for Guifi.net, not only anybody can extend the network with new nodes but also can also participate in existing projects of network extension. Also, the participants can add services on top of the network such as VoIP, FTP servers, broadcast radios, etc.</t>
        <t>Regarding active participation on an Event Streaming Open Network, we can highlight the possibility for individuals and organizations to expand the services provided by the open network. This extensibility could be made possible by different uses of the event payloads and will vary significantly depending on the sector. Since we have already proved how Flow is an infrastructure resource, innovation would play its part and its results would be materialized in services expansion.</t>
        <t>We can conclude that the same kind of openness of DNS, WWW and Email is necessary for an Event Streaming Open Network. Anybody should be able to obtain the specifications to build an implementation of the service. Also, since it should leverage the DNS infrastructure, anybody would be able to register Flow address spaces. Lastly, the specification could be governed by an institution such as the IETF, due the dependency of Flow with other Internet Services governed by this institution.</t>
      </section>
      <section anchor="open-access-infrastructure-resources">
        <name>2.2. Open Access Infrastructure Resources</name>
        <t>The literature about Commons Infrastructure (Frischmann, 2007) defines a set of criteria to evaluate if a resource can be considered an infrastructure resource. This analysis is relevant since it can provide some arguments to prove the need of an infrastructure of commons for Event Streaming, which could then be materialized in an Open Network for Event Streaming. The demand-side criteria for evaluating if a given resource can be considered as an infrastructure resource are:</t>
        <ol spacing="normal" type="1"><li>The resource can be consumed nonrivalrously.</li>
          <li>Social demand for the resource is driven primarily by downstream productive activity that requires the resource as an input.</li>
          <li>The resource is used as an input into a wide range of goods and services, including private goods, public goods and/or non-market goods.</li>
        </ol>
        <t>First, a nonrival good describes the "shareable" nature of a given good. Infrastructures are shareable in the sense that the resources can be accessed and used by multiple users at the same time. However, infrastructure resources vary in their capacity to accommodate multiple users, and this variance in the capacity differentiates nonrival resources from partially rival resources. A nonrival resource represents those resources with infinite capacity, while a partially rival resource has finite but renewable capacity. As an example, Broadcast Television is a nonrival resource since additional users do not affect the capacity of the resource. On the other hand, natural oil resources are completely rival since its availability is limited and it is not renewable. In the middle, we have partially rival resources like a highway, which may be congested. This last characteristic is also true for the Internet since it supports additional users without degrading the service to existing users to a certain extent.</t>
        <t>Secondly, infrastructure resources consumption is primarily driven by downstream activities that require this resource as an input. This means that the broad audience consumes infrastructure resources indirectly. For instance, highway infrastructure is used to transport every kind of physical good which people and organizations purchase. This facilitates the generation of positive externalities for society through the downstream production of public goods and non-market goods. These positive externalities might be suppressed under a regime where resource availability is driven solely based on individuals' willingness to pay.</t>
        <t>Regarding willingness to pay, it is relevant to analyze this factor more exhaustively. Frischmann states that if infrastructure access is allocated based on individuals' willingness to pay the potential positive externalities of that infrastructure might be stifled. Thus, infrastructure resources behave differently than end-user products: if the former are made available solely based on the end-user demands and willingness to pay, those needed infrastructure resources might never be made available. As an example, we can mention that if airports were built based on individuals' willingness to pay for them, they might not even be built. However, individuals are willing to pay for the airport's downstream activities, such as purchasing a flight or consuming air-transported goods. Then, a whole set of positive externalities are generated by the existence of an airport in a city.</t>
        <t>In the third place, infrastructure resources are used as input for a wide range of outputs. This criterion emphasizes both the variance of the downstream outputs and their nature. Thus, the infrastructure resources possess a high level of genericness which enable productive activities that produce different goods with high variance. If we consider how an airport complies with this criterion, we can mention that not only airports serve individuals that need to travel by air but are also used to transport many kinds of physical goods. These goods then enable other activities throughout the downstream value chain. Then, the output variance of the activities that take airport infrastructure as input is significantly high.</t>
        <section anchor="open-access-dns-resource-example">
          <name>2.2.1. Open Access DNS Resource Example</name>
          <t>Now, we will provide as an example how DNS complies with these criteria and why it can be considered an infrastructure resource.
1. DNS infrastructure is a partially rival resource because individuals and organizations can register domains in the Domain Name addressing space. It is partially rival because not every actor can acquire the same domain name. However, the access to registering domain names is open and non-discriminatory. Moreover, DNS is also prone to congestion, which emphasizes its partially rival nature.
2. DNS infrastructure demand is driven principally by downstream products and services. An average Internet user is not paying directly for this infrastructure, but all the Internet services the user consumes pay for DNS infrastructure. This is true for all the Internet services due to the ubiquitous nature of DNS infrastructure.
3. All Internet services take as input DNS infrastructure and produce a broad variety of outputs, which then generate positive externalities to society as a whole by means of private goods, public goods and/or non-market goods.</t>
          <t>We can conclude that DNS complies with Frischmann criteria for being considered as an infrastructure resource. The resource is represented both by the domain name that can be and by the querying capacity of DNS servers.</t>
        </section>
        <section anchor="flow-event-streaming-internet-resource">
          <name>2.2.2. Flow: Event Streaming Internet Resource</name>
          <t>In this section, we will describe an Event Streaming Internet Resources. For this, we will consider the previously described guidelines for FONN as well as the characteristics of DNS as a resource. This Event Streaming Internet Resource shall be refered to as "flow" from now onwards.</t>
          <t>To begin with, we need to define what elements could be considered as infrastructure resources in an Event Streaming Open Network. First, the resource must be capable of delivering streams of events to consumers. Secondly, it must also permit producers to write events to the stream. Thirdly, each stream must be identifiable (i.e., URI) and able to be located (i.e., URL). From now on, we will use "Flow" to refer to the infrastructure resource of an Event Streaming Open Network.
The first Frischmann criterion requires the resource to be consumed nonrivalrously. Complete nonrivalrously for any Internet Service cannot be achieved due to the possibility of congestion and potential unavailability of different elements of the network. The same would be true for a Flow resource. Moreover, the public naming addressing space for Flows would be limited to the same level as that of domain names.</t>
          <t>We will continue now with the third criterion. To illustrate the potential of Flow being used as inputs for downstream activities, we will refer to Urquhart's vision for Event Streaming. He lists two areas in which significant changes can happen:</t>
          <ol spacing="normal" type="1"><li>The use of time-critical data for customer experience and efficiency. This is driven because today's consumers are increasingly expecting great experiences, and organizations are almost always motivated to improve the efficiency of their operations.</li>
            <li>The emergence of new businesses and business models. Businesses and institutions will quickly discover use cases where data processed in a timely manner will change the economics of a process or transaction. They may even experiment with new processes, made possible by this timely data flow. Thus, flow resources will also enable innovation. These innovations are responsible for generating positive externalities.</li>
          </ol>
          <t>Then, we have demonstrated why Flow resources can be considered as infrastructure resources using Frischmann's Demand-side Theory of Infrastructure. These resources can be managed in an open manner to maximize positive externalities, which basically means maintaining its open access, not discriminating, and eliminating the need to obtain licenses to use the resources. Consequently, managing infrastructure resources in this manner eliminates the need to rely on either market actors or governments.</t>
          <t>Lastly, the adoption of an Event Streaming Open Network implies taking Flow resources as inputs for productive activities. These inputs would then be used downstream to generate private goods, public goods and/or non-market goods. Additionally, we can assure that most of the consumers of Flow would not directly consume Flow resources. They would consume the outputs of downstream activities that use Flow as input. Again, the consumers may not be willing to pay for Flow resources directly.</t>
          <t>We can conclude this section mentioning that an Event Streaming Open Network would enable one infrastructure resource called Flow. The access to this resource can be managed in an openly manner: maintaining open access, not discriminating users or different uses of the resource, and eliminating the need to obtain approval or a license to use the resource.</t>
        </section>
      </section>
    </section>
    <section anchor="necessities-for-an-event-streaming-open-network-over-the-internet">
      <name>3. Necessities for an Event Streaming Open Network over the Internet</name>
      <t>In this section, we will describe the main needs for the broad adoption of Event Streaming. The focus will be made on detecting and describing the missing capabilities that could not only enable but also accelerate the event data integration among different organizations. The different necessities detailed in this section will serve as input for an architecture design.</t>
      <section anchor="necessity-1-event-streaming-internet-resource-public-registry">
        <name>3.1. Necessity 1: Event Streaming Internet Resource Public Registry</name>
        <t>A public registry of an organization's available event streams does not exist. We will argue in this section why this is the core component that an Event Streaming Open Network can provide.</t>
        <t>Nowadays, when an organization needs to publish an event stream or event flow, they usually follow some form of the following steps:</t>
        <ol spacing="normal" type="1"><li>Develop and deploy a producer application that writes events to a queue.</li>
          <li>Create all necessary networking permissions for external public access to the queue.</li>
          <li>Inform the remote user the access information (i.e., Hostname/IP, protocol, and port) together with the required client details and technology for accessing the stream (i.e., Apache Kafka Protocol, RabbitMQ API, etc.).</li>
          <li>Create credentials for consumer authentication and authorization access to the queue.
5.Develop and deploy a consumer application that reads the queue.</li>
        </ol>
        <t>Now, we can compare this process to a simple email interaction:
1. Sender opens a graphical Mail User Agent application and sends an email to an email address formatted as user@domain.
2. The message is sent to an SMTP server that routes it to the destination SMTP servers for the given domain. Once received, the message is put into the user mailbox.
3. When the recipient checks its mailbox by IMAP or POP3, the new email is transferred to the Mail User Agent.</t>
        <t>In these two scenarios, we can see that the information needed to be exchanged offline by the actors is completely different in size and content.</t>
        <t>First, in the case of email, there is a shared naming space given by the Domain Name Service (DNS). The email format has been standardized by the IETF in RFC 5321, section 2.3.11. Thus, there is a common naming space that is used for referencing mailboxes in the format user@domain. Thus, the offline details communicated by the peers is only the recipient email address. There is no analogous standard nor an open alternative for Event Streaming.</t>
        <t>Therefore, in the case of Event Streaming, users need to perform plenty of offline communication to agree not only on the technology to use but also on the queue to use. For instance, two organizations may be currently using Apache Kafka and need to share an event stream among themselves. The organization having the source of the stream should provide the following details to the consumer organization:
* Bootstrap servers: Fully Qualified Domain Name list of the Apache Kafka brokers to start the connection to the Apache Kafka Brokers. Example: tcp://kf1.cluster.emiliano.ar:9092, tcp://kf2.cluster.emiliano.ar:9092, tcp://kf3.cluster.emiliano.ar:9092
* Topic or Queue name: name of the topic resource in the Apache Kafka Cluster
* Authentication information: User and password, TLS Certificate, etc.</t>
        <t>In the case these organizations were not both using Apache Kafka, the use case cannot be simply solved without incurring in development or complex configurations as well as adopting proprietary components.</t>
        <t>We can conclude that an Event Streaming Open Network should provide a global accessible URI for streams in a similar fashion than email, to reduce offline developers' interactions. This means being able to name event streams in a common naming space like DNS, as well as providing a mechanism for users to discover the location and connections requirements.</t>
      </section>
      <section anchor="necessity-2-establishment-of-a-user-space-for-events">
        <name>3.2. Necessity 2: Establishment of a User Space for Events</name>
        <t>Another need for broad adoption is due to the inexistence of a common and agreed user convention. In the general literature, we cannot find reference to the types of users that would consume or produce events to and from an event stream.</t>
        <t>In this sense, it is also appropriate to consider the email use case. Basically, an email user only needs to know the email address, the password, the URL of a web mail client or the details of IMAP/POP3 server connection. Once the user has this information, it's possible to access an email space or mailbox where the user can navigate the emails in it. Also, IMAP provides the possibility for the user to create folders and optionally share them with other users.</t>
        <t>There is no analogous service currently available for Event Streaming analogous to the email case. This means that the user concept in Event Streaming is limited to authentication and authorization. Thus, the user does not have access to a "streambox". The result is the impossibility for a person or an application to possess a home directory containing all the streams owned by the user.</t>
        <t>As a conclusion for this section, we can mention that it is necessary to embrace a user space resource for Event Streaming. This resource should not only solve the users' motivations and requirements but also reduce the offline verbal communications and custom development dependencies. In the next sections, we will refer to this component as the Event User Space Service.</t>
      </section>
      <section anchor="necessity-3-an-agnostic-subscription-protocol">
        <name>3.3. Necessity 3: An Agnostic Subscription Protocol</name>
        <t>A third need for wide adoption is an agnostic protocol to manage subscriptions to event streams. For this need to be solved, it would be necessary first to count with an Event User Space Service. Then, in case a user has created a stream and wants to enable public subscriptions by other users, there is no general protocol to inform other parties of this subscription intention nor its confirmation.</t>
        <t>The result is the inability for the users to seamlessly subscribe to an event stream. They either must employ protocols like MQTT or, in the need of employing other application protocols like Apache Kafka, hardcode the subscription details in the different software implementations. This means that there is no general subscription protocol for Event Streaming that is agnostic of the application protocol employed. This protocol implements both the Metadata Payload Format and Payload Format.</t>
        <t>A good example to illustrate the difference between a control protocol that implements a Metadata Payload Format from a payload protocol that implements a Payload Format is how SIP (Session Initiation Protocol) works with RTP (Real Time Protocol) to provide VoIP capabilities. The former is a control protocol that initiates and maintains a session or call while the latter is the one responsible for carrying the payloads, which in the case of VoIP it would be coded audio.</t>
        <t>Consequently, a similar definition of protocols could potentially mitigate this limitation for Event Streaming. If a protocol can be used to establish and maintain the subscriptions relationships while another different protocol is used for the events payload, all the current application protocols implementations could be supported.</t>
        <t>Additionally, by counting also with an Event Streaming Public Registry, it would be possible to provide URI for streams in a similar way as email works with the "mailto" URI. For instance, in web pages one can find that email addresses are linked to mailto URIs which, when clicked, open the default email user application (i.e., Microsoft Outlook) to send an email to the referenced email address.</t>
        <t>If a user counts with a user space or streambox, then a user application like an email client could provide access to it. Then, if the user clicks on a link of a stream URI (i.e. "stream:myeventflow"), the streambox application would open and subscribe to the given stream.</t>
        <t>Currently, the Metadata Payload Format as well as the Payload Format are both provided by the queue or log application protocol. In the case of Apache Kafka, both formats are implemented within the Apache Kafka Protocol. This introduces a barrier for interoperability among different technologies, meaning that flows of event data cannot be seamlessly connected, without relying on custom development or proprietary software licensing.</t>
        <t>We can conclude that there is an actual need for an open specification of an Event Subscription Service for event streams, which implements what Urquhart calls Metadata Payload Format. This specification could be materialized in a network protocol that introduces an abstraction for the event queue or log technologies implemented by different organizations.</t>
      </section>
      <section anchor="necessity-4-an-open-cross-sector-payload-format">
        <name>3.4. Necessity 4: An Open Cross-sector Payload Format</name>
        <t>Currently, the different implementations of Event Streaming combine both the Payload Format with the Metadata Format. This means that the same protocol utilized for payload transport is used for subscription management.</t>
        <t>When a producer intends to publish events to a queue or, using Apache Kafka terminology, when a producer intends to write records to a topic, first it needs to initiate a connection to at least one of the Apache Kafka Brokers. In that initial exchange of TCP packages, the producer is authenticated, authorized, and informed with topic details. This set of transactions would belong to a protocol that implements a Metadata Payload Format. Afterwards, when the Producer starts writing the events to the topic, it encapsulates the event payload in a Kafka Protocol message. This latter behavior makes use of a Payload Format. Thus, we can observe how both theoretical formats are coupled in a single protocol. Similar behavior of a coupled Metadata and Payload Format in one single protocol happens also in AMQP, MQTT and RabbitMQ.</t>
        <t>As for the consumer, the behavior is the same with the difference that the initial intention is to subscribe to a queue or, in Apache Kafka terminology, to consume records of a topic. Then, a set of TCP packages encapsulating the Apache Kafka protocol authenticates, authorizes, and informs the Consumer with topic details for consumption. Afterwards, the consumer can start polling for new records in the different partitions of the topic. It is worth mentioning that the consumer needs to implement more queue management logic than the Producer, especially when multiple replicas of a consumer type are deployed.</t>
        <t>If we focus on the Payload Format, there is the need for an implementation-agnostic payload format suitable for Event Streaming. In this sense, CloudEvents project of the CNCF proposes a specification and a set of libraries for this purpose. The goal is to use CloudEvents specification as a Payload Format regardless of the Payload Protocol being used. For instance, we could transmit events in the CloudEvents format using the Kafka or AMQP Protocol.</t>
        <t>The general structure of the CloudEvents Payload Format includes a standardized methodology to include event data in an event message. For instance, instead of defining a customized JSON structure for sending the events of temperature changes measured by a device, a CloudEvent object could be used. Temperature could be included as an attribute in the CloudEvent object.</t>
        <t>We can then conclude that while there is no current protocol candidate that implements the Metadata Format, CloudEvents is a good candidate for the Payload Format needed in an Event Streaming Open Network. In this way, the different CloudEvents libraries made available in several programming could be leveraged.</t>
      </section>
    </section>
    <section anchor="event-streaming-open-network-architecture">
      <name>4. Event Streaming Open Network Architecture</name>
      <t>In this section, we will describe the overall architectural proposal for an Event Streaming Open Network. This description will include the different actors in play, the software components required, as well as the network protocols that should be specificized.</t>
      <section anchor="architecture-overview">
        <name>4.1. Architecture overview</name>
        <t>In Figure 1 we illustrate a high-level overview of an architecture proposal for the Open Network.</t>
        <figure>
          <name>Figure 1</name>
          <artwork alt="High-level overview of the Event Streaming Open Network" type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure1.svg"/>
        </figure>
        <t>We can identify different Network Participant (NP) in Figure 1 represented by different colors. The different NPs act as equals when consuming or producing events as part of the Flows they own. All of NPs implement the Event Streaming Open Network Protocol, which Is described in the next chapter.</t>
        <t>In the diagram, an initial flow starts on the orange NP to which a user in the blue NP is subscribed. After processing the events received in the first flow, the results are published to a new flow in NP blue, to which the orange NP is subscribed as well. Now, the green participant is subscribed to the same flow, enabling downstream activities across the rest of the network participants.</t>
        <t>It is possible to observe how the high-level architecture allows sharing the streaming of events across different network participants and their users. Also, there is also the need for security, in order to allow or deny the access to write to and read from flows.</t>
        <t>Regarding security, the architecture considers the integration with an Identity &amp; Access Management service, which could implement popular protocols such as OAuth, SAML or SASL. However, the network should also enable anonymous access in the same way FTP does. This means that a given NP could publicly publish flow and allow any party to subscribe to it.</t>
        <t>For example, nowadays the Network Time Protocol (NTP) is used to synchronize the day and time on servers. There are many NTP servers available that allow anonymous access, meaning that the service is openly available. The same must be considered for the Event Streaming Open Network.</t>
        <t>Additionally, the NP must be able to expand the capacity to support any number of flows, as well as extending the network with new services. Not only NP must be able to include any given set of data within events but also, they must be able to build applications and services on top of the network by employing the architecture primitives.</t>
        <figure>
          <name>Figure 2</name>
          <artwork alt="Event Streaming Open Network Architecture components" type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure2.svg"/>
        </figure>
        <t>Now, we provide a brief description of all the components that appear in the diagram of Figure 2. In the next sections further details of the components are provided.</t>
        <ul spacing="normal">
          <li>Flow Events Broker (FEB): a high-available and fault-tolerant service that provide queues to be consumed by network services, by users, and their applications. An example of an Event Queue Broker can be Apache Kafka, AWS SQS or Google Cloud PubSub. The payload format implemented by these tools are what in 3.1.4 we called Event Streaming Payload Format.</li>
          <li>Flow Name Service (FNS): a DNS-based registry that acts as an authoritative server for a set of domain names, which are used to represent flow addresses in a flow namespace. These domains contain all the necessary information to resolve flow names into flow network locations. This component refers to what in 3.1.1 we named Event Streaming Registry.</li>
          <li>Flow Namespace User Agent (FNUA): an application similar to User Mail Agents like Microsoft Outlook or Gmail. This application provides access to flow namespaces to users of the network. 
The definition of this component implies the specification of a dedicated protocol. We will refer to this protocol as FNAP (Flow Namespace Accessing Protocol).</li>
          <li>Flow Namespace Accessing Agent (FNAA): the server-side of the Flow Namespace User Agent. This component is the one that must provide convenient integration methods for GUI. This component refers to what in 3.1.2 we named Event User Space Service.
This component must implement the same protocol selected for the Flow Namespace User Agent: FNAP (Flow Namespace Accessing Protocol).</li>
          <li>Flow Processor (FP): a flow processing instance used to set up subscriptions that connect local or remote flows on demand. This component implements the processing part of what in 3.1.3 we called Event Subscription Service. This component will be created and managed by a FNAA instance, and the communication is held through an Inter-process Communications (IPC) interface. Also, this service must implement an Event Payload Format, for which we will mainly consider CNCF's CloudEvents and Protobuf.</li>
          <li>Flow Namespace Accessing Protocol (FNAP): the protocol implemented in the Flow Namespace Accessing Agent as well as in the Flow Namespace User Agent. The former will act both as a server and a client while the latter only as a client. This protocol is described in the next chapter.</li>
        </ul>
        <section anchor="flow-events-broker-feb">
          <name>4.1.1. Flow Events Broker (FEB)</name>
          <t>The FEB implementation that we will mostly consider is Apache Kafka. This open-source project is quickly becoming a commodity platform, and major cloud providers are building utilities for it. However, as a design decision, it should be possible to use the same protocols to support other applications, such as RabbitMQ, Apache Pulsar or the cloud-based options like AWS SQS or Azure Events Hub.</t>
          <t>Apache Kafka is the ecosystem leader in the Event Streaming space, considering mainly adoption. There is a growing set of tools and vendors supporting its installation, operation, and consumption. This fact makes Apache Kafka much more appealing to enterprise developers. However, the broker should provide a common set of functionalities which can be seen in the diagram of Figure 3.</t>
          <figure>
            <name>Figure 3</name>
            <artwork type="svg" alt="Event Streaming Open Network Architecture components" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure3.svg"/>
          </figure>
          <t>The selection of the Events Broker will impact on the implementation of the Flow Namespace Accessing Agent. This last component will be responsible for knowing how to set up and manage flows on top of different Events Brokers.</t>
        </section>
        <section anchor="flow-name-service-fns">
          <name>4.1.2. Flow Name Service (FNS)</name>
          <t>FNS is a core component for the overall proposed architecture. This component provides all needed functionalities for obtaining Flow connection details based on a Flow URI (Uniform Resource Identifier). Thus, it is required to define a URI format for Flow resources and to specify mechanisms for resource location resolution.</t>
          <t>In this section, we will focus on describing both the URI for Flow as well as the DNS mechanism for obtaining Flow network location details.</t>
          <section anchor="leveraging-dns-infrastructure">
            <name>4.1.2.1. Leveraging DNS infrastructure</name>
            <t>As mentioned previously, this component must maximize its leverage on the existing Internet DNS infrastructure. The reason for this requirement is to avoid defining new protocols and services that prevent broad adoption. Currently, DNS is the de facto name resolution protocol for the Internet, and there exist libraries for its usage on every programming language.</t>
            <t>Whereas DNS is mainly used to resolve FQDN (Fully Qualified Domain Names) into IP addresses, there are many other functionalities provided by the global DNS infrastructure. Theoretically, DNS is an open network of a distributed database. Individuals and organizations that want to participate in the network need to register a domain name and set up Authoritative DNS servers for domains.</t>
            <t>It is not in the scope of this work to detail the different available usages of DNS functionalities, but we can mention that it provides special Resource Records (i.e., types of information for a FQDN) that are solely used by special protocols. For instance, the MX Resource Records are used by SMTP servers to exchange email messages.</t>
            <t>For the Flow Open Network, it will be required to define a URI format for flows as well as the mechanism to resolve an URI into all the needed information to connect to a flow. In the case of email, a URI is the email address while the connection details will be the SMTP server responsible for receiving emails for that account. For instance, an email URI could be user@domain.com while its connection details could be smtp://mail.domain.com. The way in which the connection details are obtained is by resolving the MX DNS Resource Records of domain.com, which in this example is mail.domain.com.</t>
          </section>
          <section anchor="flow-uri">
            <name>4.1.2.2. Flow URI</name>
            <t>As we mentioned previously, the first needed element is a URI definition for flow resources. These resources identification must capture the following details:
* Domain, a registered domain in which create flow resources references. For example, airport.com.
* Flow Namespace, a subdomain which is solely used by users to host flow names. This subdomain must be delegated to the Flow Name Server component and desirable should not be used for any other purpose other than flow.
* Flow Name, a name for each flow that must be unique within its domain. The combination of flow name and flow domain results in an FQDN. For instance, we could have a flow named arrivals of the domain flow.airport.com. Thus, the FQDN of the flow would be arrivals.flow.airport.com. Also, the name can contain dots so that the following FQDN could be also used: airline.arrivals.flow.airport.com.</t>
            <t>Thus, the general syntax of a flow URI would be:</t>
            <t>flow://flow_name.flow_namespace.domain</t>
            <t>This URI has the advantage that is similar to "mailto" URI and could be implemented in HTML to refer to flow resources. Some examples:</t>
            <ul spacing="normal">
              <li>flow://entrances.building.company.com</li>
              <li>flow://exits.building.company.com</li>
              <li>flow://temperature.house.mydomain.com</li>
              <li>flow://pressure.room1.office.mydomain.com</li>
            </ul>
            <t>The flow URI must unequivocally identify a flow resource and provide, by means of DNS resolution mechanisms, all the information required to use the flow. Among these parameters, at least the following should be resolvable:</t>
            <ul spacing="normal">
              <li>Event Queue Broker protocol utilized by the flow. For instance, if Apache Kafka is used, the protocol would be "kafka"; In case RabbitMQ is used by the flow, "amqp". Also, it must be informed if the protocol is protected by TLS.</li>
              <li>Event Queue Broker FQDN or list of FQDNs that resolve to the IP address of one or a set of the Event Queue Brokers. For instance, kafka-1.mycompany.com, kafka-2.mycompany.com.</li>
              <li>Event Queue Broker Port used by the Event Queue Brokers. For instance, in the case of Kafka: 9092, 9093.</li>
              <li>Event Queue Broker Transport Security Layer can be implemented. Thus, it is needed to know if the connection uses TLS before establishing it.</li>
              <li>Queue Name hosted in the Event Queue Broker, which must be equal to that of the corresponding flow name.</li>
            </ul>
            <t>The general syntax of the Flow URI would be as follows:</t>
            <t>flow://flowName.flowCategory.myNameSpace.domain.tld</t>
            <ul spacing="normal">
              <li>Flow Namespace FQDN: myNameSpace.domain.tld</li>
              <li>Flow Name: flowName.flowCategory</li>
              <li>Flow FQDN: flowName.flowCategory.myNameSpace.domain.tld</li>
            </ul>
            <t>The following are examples of this URI Syntax:</t>
            <t>flow://notifications.calendar.people.syndeno.com</t>
            <ul spacing="normal">
              <li>Flow Namespace FQDN: people.syndeno.com</li>
              <li>Flow Name: notifications.calendar</li>
              <li>Flow FQDN: notifications.calendar.people.syndeno.com</li>
            </ul>
            <t>flow://created.invoice.finance.syndeno.com:</t>
            <ul spacing="normal">
              <li>Flow Namespace FQDN: finance.syndeno.com</li>
              <li>Flow Name: created.invoice</li>
              <li>Flow FQDN: created.invoice.finance.syndeno.com</li>
            </ul>
          </section>
          <section anchor="flow-name-resolution">
            <name>4.1.2.2. Flow name resolution</name>
            <t>In Figure 4, we can see how a Flow FQDN can be resolved by means of the Flow Name Service.</t>
            <figure>
              <name>Figure 4</name>
              <artwork alt="High-level overview of the interactions with the Flow Name Service component." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure4.svg"/>
            </figure>
            <t>In order to illustrate the Flow Name resolution procedure by the FNAA (Flow Namespace Accessing Agent), we can consider the following flow URI:</t>
            <t>flow://notifications.calendar.people.syndeno.com</t>
            <t>First, the FNAA will perform a query to the DNS resolvers. These will perform a recursive DNS query to obtain the authoritative name servers for the Flow Namespace: people.syndeno.com. Thus, the authoritative name servers for syndeno.com will reply with one or more NS Resource Record containing the FQDN for the authoritative name servers of people.syndeno.com.</t>
            <t>Secondly, once these name servers are obtained, the FNUA will perform a PTR query on the Flow FQDN adding a service discovery prefix. The response of the PTR query will return another FQDN compliant with SRV DNS Resource Records (RFC-2782) and DNS Service Discovery (RFC-6763).</t>
            <t>In this case, the query for PTR records would be as follows:</t>
            <t>;; QUESTION SECTION:
;notifications.calendar.people.syndeno.com.             IN      PTR</t>
            <t>The response would be in the following form:</t>
            <t>;; ANSWER SECTION:
notifications.calendar.people.syndeno.com. 21600 IN     PTR _flow._tcp.notifications.calendar.people.syndeno.com.</t>
            <t>Using the FQDN returned by this query, an additional query asking for SRV records is made:</t>
            <t>;; QUESTION SECTION:
;_flow._tcp.notifications.calendar.people.syndeno.com.          IN      SRV</t>
            <t>;; ANSWER SECTION:
_flow._tcp.notifications.calendar.people.syndeno.com. 875 IN    SRV     30 30 65432 fnaa.syndeno.com.
_flow._tcp.notifications.calendar.people.syndeno.com. 875 IN TXT "tls"</t>
            <t>_queue._flow._tcp.notifications.calendar.people.syndeno.com. 875 IN     SRV     30 30 9092 kafka.syndeno.com.
_queue._flow._tcp.notifications.calendar.people.syndeno.com. 875 IN TXT "broker-type=kafka tls"</t>
            <t>First, the response informs the network location of the FNAA server, in this case a connection should be opened to TCP port 65432 of the IP resulting of resolving fnaa.syndeno.com:</t>
            <t>;; QUESTION SECTION:
;fnaa.syndeno.com.              IN      A</t>
            <t>;; ANSWER SECTION:
fnaa.syndeno.com.       21600   IN      A       208.68.163.200</t>
            <t>Secondly, this response offers other relevant information, like the TCP port where the queue service is located (9092). It also includes a TXT Resource Record that establishes the protocol of the Event Queue Broker, defined in the variable "broker-type=kafka".</t>
            <t>Now, using the returned FQDN for the queue, kafka.syndeno.com, the resolver can perform an additional query:</t>
            <t>;; QUESTION SECTION:
;kafka.syndeno.com.             IN      A</t>
            <t>;; ANSWER SECTION:
kafka.syndeno.com.      21600   IN      A       208.68.163.218</t>
          </section>
        </section>
        <section anchor="flow-namespace-accessing-agent-fnaa">
          <name>4.1.3. Flow Namespace Accessing Agent (FNAA)</name>
          <t>The Flow Namespace Accessing Agent is the core component of a Network Participant. This server application implements the Flow Namespace Accessing Protocol that allows client connections.</t>
          <t>In the diagram of Figure 5 we can see the different methods that the FNAA must support.</t>
          <figure>
            <name>Figure 5</name>
            <artwork alt="High-level overview of the interactions among FNAA servers." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure5.svg"/>
          </figure>
          <t>The clients connecting to a FNAA server can be remote FNAA servers as well as FNUA. The rationale is that users of a NP connect to the FNAA by means of a FNUA. On the other hand, when a user triggers a new subscription creation, the FNAA of his NP must connect as client to a remote FNAA server.</t>
        </section>
        <section anchor="flow-processor-fp">
          <name>4.1.4. Flow Processor (FP)</name>
          <t>Whenever a new subscription creation is triggered and all remote flow connection details are obtained, the FNAA needs to set up a Processor for it. The communications of the FNAA to and from the FP is by means of an IPC interface. This means that there can be different implementations of Processors, one of which will be the Subscription Processor.</t>
          <t>In the diagram of Figure 6, we can see the initial interface methods that should be implemented in a Flow Processor.</t>
          <figure>
            <name>Figure 6</name>
            <artwork alt="High-level overview of the IPC interface for the FNAA server and Flow Processors communications." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure6.svg"/>
          </figure>
          <t>Depending on the use of the processor, different data structures should be added to the different methods. In the case of a Subscription Processor, the minimum information will be the remote and local Flow connection details. Moreover, the interface also should include methods to update the Processor configuration and to destroy it, once a subscription is revoked. Finally, due to the nature of the stream communication, there could also be methods available to pause and to resume a Processor.</t>
          <t>There can be different types of Processors, which we can see in Figure 7.</t>
          <figure>
            <name>Figure 7</name>
            <artwork alt="High-level overview of the IPC interface for the FNAA server and Flow Processors communications." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure7.svg"/>
          </figure>
          <t>In Figure 7, we can see that there are different types of Flow Processors:
* Bridge Processor: Consumes events from a Flow located in an Event Broker (i.e., Apache Kafka) and transcribes them to a single Flow (local or remote).
* Collector Processor: Consumes events from N Flows located in an Event Broker and transcribes the aggregate to a single Flow (local or remote).
* Distributor Processor: Consumes events from a single Flow and transcribes or broadcast to N Flows (local or remote).
* Signal Processor: Consumes events from N Flows and produces new events to N Flows (local or remote)</t>
          <t>To implement the previously described Subscription Processor, we can utilize some form of the Bridge Processor. Although we are initially considering the basic use case of subscription, it must be possible for the network to extend the processor types supported. In any case, the different FNAA servers involved must be aware the supported processor types, with the goal of informing the users the capabilities available in the FNAA server. For instance, the fact that a FNAA supports the Bridge Processor should enable the subscription commands in the FNAA, for users to create subscriptions using the Bridge Processor.</t>
          <t>In summary, the IPC interface should support all the possible processors that the network may need although we are initially considering the subscription use case.</t>
        </section>
        <section anchor="flow-namespace-user-agent-fnua">
          <name>4.1.5. Flow Namespace User Agent (FNUA)</name>
          <t>The FNUA is an application analogous to email clients such as Microsoft Office or Gmail. These applications implement either different network protocols to access mailboxes by means of IMAP and/or POP3. In the case of FNUA, the protocol implemented is the FNAP (Flow Namespace Accessing Protocol).</t>
          <t>The FNUA is an application that acts as a client for the FNAA server. Only users that possess accounts in a Network Participant should be able to login to FNAA to manage Flow Namespaces. The FNUA could be any kind of user application: web application, desktop application, mobile application or even a cli tool.</t>
          <t>In the Diagram of Figure 8 we can see the actions that the user can request to the FNUA.</t>
          <figure>
            <name>Figure 8</name>
            <artwork alt="High-level overview of the interactions between a user and the Flow Namespace User Agent component." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure8.svg"/>
          </figure>
          <t>The main goal of the FNUA is to provide the user with access to Flow Namespaces and the flows hosted in them. A user may have many Flow Namespace and many Flows in each of them. By means of the FNUA, the user can manage the Flow Namespaces and the Flows in them. Also, the FNUA will provide the capabilities required to subscribe to external Flows, whether local to the FNAA, local to the NP or remote (in a different NP FNAA server).</t>
        </section>
      </section>
      <section anchor="communications-examples">
        <name>4.2. Communications Examples</name>
        <t>In this section, two usage examples of Network Participants communications are provided. The first one, we call unidirectional, since one NP subscribes to a remote Flow of a different NP. The second one, we call it bidirectional, since now these NP have mutual subscriptions.</t>
        <section anchor="unidirectional-subscription">
          <name>4.2.1. Unidirectional Subscription</name>
          <t>In the diagram of Figure 9, we can see an integration between two NP. In this case, there is a FlowA hosted in the Orange NP to which the FlowB in the Blue NP is subscribed. Both FlowA and FlowB count with a queue hosted in the Flow Events Broker, which could be an Apache Kafka instance for example. However, it must be possible to employ any Flow Events Broker of the NP's choice.</t>
          <figure>
            <name>Figure 9</name>
            <artwork alt="Example of a unidirectional subscription among two Network Participants." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure9.svg"/>
          </figure>
          <t>The steps followed to set up a subscription to a remote flow are:
1. A user of the Blue NP creates a new subscription to remote FlowA by means of the Flow Namespace User Agent (FNUA).
2. The FNUA connects to the Flow Namespace Accessing Agent (FNAA) of the Blue NP to inform the user request.
3. The FNAA in the Blue NP discovers the remote FNAA to which it must connect to obtain the flow connection parameters. First, it needs to authenticate and, if allowed, the connection parameters will be returned.
4. Once the FNAA in the Blue NP has all the necessary information, it will set up a new Processor that connects the flow in the Orange NP to a flow in the Blue NP.
5. Once the subscription is brought up, every time a Producer in the Orange NP writes an event to FlowA, the Flow Processor will receive it, since it is subscribed to it. Then, the Flow Processor will write that event to FlowB in the Blue NP.
6. From now on, every Consumer connected to FlowB will receive the events published on FlowA.</t>
          <t>In case the user owner of FlowA in the Orange NP wishes to revoke the access, it must be able to do so by means of security credentials revoking against the Identity &amp; Access Manager of the Orange NP.</t>
        </section>
        <section anchor="bidirectional-subscription">
          <name>4.2.2. Bidirectional Subscription</name>
          <t>In Figure 10 we can see an example of all the components needed to set up a flow integration between two different NP. In this case, there are two flows being connected:
* FlowA of the Orange NP with FlowB of the Blue NP
* FlowC of the Blue NP with FlowD of the Orange NP</t>
          <figure>
            <name>Figure 10</name>
            <artwork alt="Example of a bidirectional subscription among two Network Participants." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure10.svg"/>
          </figure>
          <t>Each Flow has its corresponding Queue hosted in the NP Flow Events Broker. Also, there is one Flow Processor for each connection, meaning that these components are in charge of reading new events on source flows to write them to the destination flows as soon as received.</t>
          <t>Also, we can see that in order to connect FlowB to FlowA, a connection from the Blue NP's FNAA has been initiated against the Orange NP's FNAA. This connection uses the FNAP to interchange the flow connection details. Analogously, the FNAA connection to set up the integration of FlowC with FlowD has been initiated by the Orange NP's FNAA.</t>
          <t>After the flow connection details are obtained, the different Flow Processors are set up to consume and produce events from and to the corresponding Queue in the different NPs.</t>
          <t>Once the two processors are initialized, all the events produced to FlowA in the Orange NP will be forwarded to FlowB in the Blue NP; and all the events produced to FlowC in the Blue NP will be forwarder to FlowD in the Orange NP.</t>
        </section>
      </section>
    </section>
    <section anchor="event-streaming-open-network-protocol">
      <name>5. Event Streaming Open Network Protocol</name>
      <t>The protocol to be used in an Event Streaming Open Network is a key component of the overall architecture and design. This chapter is dedicated to thoroughly describe this protocol.</t>
      <section anchor="protocol-definition-methodology">
        <name>5.1. Protocol definition methodology</name>
        <t>It is now necessary to specify the protocol needed for the Flow Namespace Accessing Agent or FNAA, which we have named the Flow Namespace Accessing Protocol or FNAP. In the diagram of Figure 11 we can see how an FNAA client connects with a FNAA server by means of the FNAP.</t>
        <figure>
          <name>Figure 11</name>
          <artwork alt="FNAA client and server communicate using FNAP." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure10.svg"/>
        </figure>
        <t>In order to define a finite state machine for the protocol and the different stimuli that cause a change of state, the model presented by M.Wild (Wild, 2013) in her paper "Guided Merging of Sequence Diagrams" will be employed. This model is beneficial since it provides an integrated method both for client and server maintaining the stimuli relationship that trigger a change of state in each component.</t>
        <figure>
          <name>Figure 12</name>
          <artwork alt="Merged Sequence Diagram for SMTP proposed by Wild, 2013." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure12.svg"/>
        </figure>
        <t>In Figure 12 we have the method proposed by Wild for SMTP, in which there are boxes representing states and arrows representing transitions. Each transition has a label composed of the originating stimulus that triggers the transition and a subsequent stimulus effect triggered by the transition itself. For instance, when a client connects to an SMTP Server, the client goes from "idle" state to "conPend" state. The label of this transition includes "uCon" as the stimulus triggering the transition, which triggers the effect "sCon". Then, on the diagram for the server we can see that the "sCon" triggers the transition from "waiting" state to "accepting" state in the server.</t>
        <t>This method will be used to define the states and transitions for the Flow Namespace Accessing Protocol both for client and server.</t>
      </section>
      <section anchor="flow-namespace-accessing-protocol-fnap">
        <name>5.2. Flow Namespace Accessing Protocol (FNAP)</name>
        <t>Using the model proposed by Wild described previously, we define the finite-state machine for the FNAA Server, which we can see in Figure 13.</t>
        <figure>
          <name>Figure 13</name>
          <artwork alt="Finite-state machine for the Flow Namespace Accessing Protocol." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure13.svg"/>
        </figure>
        <t>The model in right side of Figure 13 shows that the FNAA server starts in a "waiting" state, which basically means that the server has successfully set up the networking requirements to accept client connections. Then, when a client connects, a transition is made to "accepting" state, in which internally the authentication procedure is made. If the authentication is successful, a transition is made to "ready" state, meaning that the client can now execute commands on the FNAA server.</t>
        <t>For each command that the client executes, a transition is made to "cmdRecvd" state. Then, a response is returned to the client, transitioning again to "waiting" state. When the client executes the "Quit" command, a transition is made to the "waiting" state and the server must free all used networking resources for the now closed connection.</t>
        <t>On the left side of Figure 13, we also have the client state machine with its corresponding transitions. The client triggers a connection to the server and once established, an authentication is needed. Once the authentication is correctly done, the client can start requesting commands to the server. For each command executed by the client, a transition is made to "cmdPend" state, until a response is returned by the server.</t>
        <t>Eventually, a "Quit" command will be executed by the client and the connection will be closed.</t>
      </section>
      <section anchor="implementation">
        <name>6. Implementation</name>
        <t>In this section, we provide an approach for the overall implementation of the proposed Event Streaming Open Network. Considering the components defined previously for the architecture, we will define which existing tools can be leveraged and those that require development.</t>
        <section anchor="objectives">
          <name>6.1. Objectives</name>
          <t>The objective of this implementation is to provide specifications for an initial implementation of the overall architecture for the Event Streaming Open Network. Whenever it is possible, existing tools should be leveraged. For those components that need development, a thorough specification is to be provided.</t>
          <section anchor="implementation-overview">
            <name>6.2. Implementation overview</name>
            <t>In Figure 14, we have a diagram of the overall implementation proposal. The components that have the Kubernetes Deployment icon are the ones to be managed by the FNAA server instance. Then, we have a Kafka Cluster that provides a Topic instance for each flow. Finally, the DNS Infrastructure is leveraged.</t>
            <figure>
              <name>Figure 14</name>
              <artwork alt="Implementation overview using Kubernetes, Apache Kafka, DNS Bind9 and the Flow CLI tool." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure14.svg"/>
            </figure>
          </section>
        </section>
      </section>
      <section anchor="existing-components">
        <name>6.3. Existing components</name>
        <t>In this section, we describe the existing software components that can be leveraged for implementation.</t>
        <section anchor="flow-events-broker-feb-1">
          <name>6.3.1. Flow Events Broker (FEB)</name>
          <t>Since there are currently many implementations for this component, it is necessary to develop the needed integrations of other components of the architecture to the main market leaders. Thus, we will consider the following Flow Events Broker for the implementation: Apache Kafka, AWS SQS and Google Compute PubSub.</t>
          <t>In summary, this component does not need to be developed from scratch. However, the FNAA will need to be able to communicate with the different Flow Events Broker, meaning that it must implement their APIs as a client.</t>
        </section>
        <section anchor="flow-name-service-fn">
          <name>6.3.2. Flow Name Service (FN)</name>
          <t>This component can be completely implemented by leveraging on the ISC Bind9 software component, which is the de facto leader for DNS servers. A given NP will need to deploy a Bind9 Nameserver and enable both DNSSEC and DNS Dynamic Update.</t>
          <t>The impact of adopting Bind9 for the implementation means that the FNAA component needs to be able to use a remote DNS Server to manage the Flow URI registration, deregistration and execute recursive DNS resolution.</t>
        </section>
        <section anchor="components-to-be-developed">
          <name>6.4. Components to be developed</name>
          <t>In this section, we describe a set of tools that require development. These components, especially the FNAA, are the core components of every Network Participant. Moreover, these are the components that implement the network protocol FNAP.</t>
          <t>Since these are the core components of the network, they are the natural candidates for validation. In the next chapter, we will show the feasibility of the core network components in the form of a Proof of Concept.</t>
          <section anchor="flow-namespace-accessing-agent-fnaa-1">
            <name>6.4.1. Flow Namespace Accessing Agent (FNAA)</name>
            <t>The Flow Namespace Accessing Agent is a server component that triggers the creation of child processes that implement the different Flow Processors. This means that the instance running the FNAA will bring up new processes for each processor. One way of implementing this functionality can be a parent process that creates new child processes for each processor. However, this would imply the need of creating and managing different threads in a single FNAA instance.</t>
            <t>The problem with the approach of a parent process and child processes for the FNAA is on the infrastructure level. The more processor a FNAA needs to manage, the more compute resources the FNAA would need. In the current cloud infrastructure context, this is problem because it means that additional compute resources should be assigned to the FNAA, depending on the quantity of processors and the required resources for each of them. In summary, this approach would be vertically scalable but not horizontally scalable.</t>
            <t>Then, to avoid the scalability issue, the approach we propose is by implementing a Cloud Native application. By leveraging on Kubernetes, it is possible to trigger the creation of Deployments, which are composed of Pods. Each Pod can contain a given quantity of containers, which are processes running in a GNU/Linux Operating System. In this way, we can dedicate a Pod to run the FNAA server and different Pods to run the Processors. This approach provides a convenient process isolation and enables both horizontal and vertical scalability.</t>
            <t>Moreover, the way in which the FNAA would bring up and manage Processor instances would be though an integration with the underlaying Kubernetes instance, by means of the Kubernetes API. The result is a Cloud Native application that leverages the power and flexibility of Kubernetes to manage the Processor instances.</t>
            <t>On the other hand, the programming language for the FNAA must also be defined. For this, we consider that it must be possible to implement the FNAA and the Flow Processors in different programming languages. For the FNAP it is recommended to employ Golang, since Kubernetes CLI tool is implemented in this language and there are several libraries available for integration. As for the Flow Processors, it must be possible to use any programming language as long as the IPC interface is correctly implemented.</t>
            <t>Regarding the IPC interface for the communications between the FNAA and the Flow Processors, the recommendation is to employ gRPC together with Protobuf. The rationale for choosing this this technology is the fact that gRPC enables binary communications, which are the desired type of communication for systems integration. Then, both the FNAA and the Flow Processors must share this Protobuf interface definition and implement it accordingly through gRPC.</t>
            <t>Finally, the FNAA must implement the protocol we have named FNAP, which provides the main set of functionalities for the Event Streaming Open Network. The implementation of FNAP must be stateful, in the sense that it is connection-based. Additionally, the implementation must be text-based, with the goal that humans can interact with FNAA servers in the same way that it is possible for SMTP servers. The transport protocol must be TCP with no special definition for a port number, since the port should be able to be discovered by means of DNS SRV Resource Records.</t>
            <t>Regarding security for the FNAA servers, TLS must be supported. This means that any client can start a TLS handshake with the FNAA servers before issuing any command.</t>
            <t>In conclusion, the implementation of the FNAA over Kubernetes provides the needed flexibility and set of capabilities required for this component. It is recommended to implement the FNAA in Golang and enable the implementation of Flow Processors in any programming language as long as the Protobuf interface is correctly implemented. Finally, the FNAA must implement the protocol FNAP in a connection-based and text-based manner.</t>
          </section>
          <section anchor="flow-namespace-user-agent-fnua-1">
            <name>6.4.2. Flow Namespace User Agent (FNUA)</name>
            <t>The Flow Namespace User Agent (FNUA) can have different implementations as long as they comply with the protocol FNAP.</t>
            <t>We propose the initial availability of a CLI tool that acts as a Flow Namespace User Agent. This CLI tool must provide a client implementation of all the functionalities available in the FNAA server. Among the functionalities to be implemented as a must, we can mention:
* Discover the FNAA server for a given Flow URI.
* Connect to the FNAA server to manage Flow Namespaces and Flows, as exemplified in Figure 8.</t>
            <t>Additionally, the FNUA should be able to discover the Authoritative FNAA server for a given Flow Namespace. This discovery shall be performed by leveraging on the DNS-SD specification. Refer to Annex D to review the discovery process.</t>
            <t>Regarding the implementation of the CLI tool, it is recommended to employ Golang together with Cobra, a library specialized to create CLI tools. In Figure 15 we have a diagram that shows the different functionalities that the CLI tool should implement.</t>
            <figure>
              <name>Figure 15</name>
              <artwork alt="Flow CLI parameters diagram." type="svg" src="https://raw.githubusercontent.com/syndeno/draft-spinella-event-streaming-open-network/main/images/Figure15.svg"/>
            </figure>
          </section>
        </section>
      </section>
    </section>
    <section anchor="proof-of-concept">
      <name>7. Proof of Concept</name>
      <t>In this section, we will focus on providing a minimum implementation of the main Event Streaming Open Network component: the Flow Namespace Accessing Agent. This implementation should serve as a Proof of Concept of the overall Event Streaming Open Network proposal.</t>
      <t>As described in the previous section, the Flow Namespace Accessing Agent (FNAA) is the main and core required component for the Open Network. All Network Participants must deploy an FNAA server instance in order to be part of the network. The FNAA actually implements a server-like application for the Flow Namespace Accessing Protocol (FNAP). Then, the first objective of this Proof of Concept is to show an initial implementation of the FNAA server component.</t>
      <t>On the other hand, the FNAA is accessed by means of a Flow Namespace User Agent (FUA). This component acts as a client application that connects to a FNAA. Also, this component can take different forms: it could be a web-based application, a desktop application or even a command line tool. For the purposes of this Proof of Concept, we will implement a CLI tool that acts as a client application for the FNAA. Thus, the second objective of this PoC is to provide an initial implementation of the FNUA client component.</t>
      <t>In the following sections, we will first describe the minimum functionalities considered for validating the overall proposal for the Event Streaming Open Network. This minimum set of requirements for both the FNAA and the FNUA will compose the Proof of Concept.</t>
      <t>Afterwards, we will describe the technology chosen for the initial implementation of both the FNAA and the FNUA. Then, a description of how these tools work in isolation will be provided. Subsequently, we will review different use cases to prove how the network could be used by network participants and its users.</t>
      <t>Lastly, we will provide a conclusion for this Proof of Concept, where we mentioning if and how the minimum established requirements have been met or not.</t>
      <section anchor="minimum-functionalities">
        <name>7.1. Minimum functionalities</name>
        <t>Network Participants system administrators must be able to run a Server Application that acts as FNAA.</t>
        <t>Users using a Client Application actiong as a FNUA must be able to:
1. Access the flow account and operate its flows.
2. Create a new flow.
3. Describe an existing flow.
4. Subscribe to an external flow.</t>
      </section>
      <section anchor="fnaa-server-application">
        <name>7.2. FNAA - Server application</name>
        <t>The FNAA server application must implement FNAP as described in Section 6. Basically, the FNAA will open a TCP port on all the IP addresses of the host to listen for new FNUA client connections.</t>
        <t>The chosen language for the development of the FNAA is GoLang. The reason for choosing GoLang is because Kubernetes is written in this language and there is a robust set of libraries available for integration. Although there is no integration built with Kubernetes for this Proof of Concept, the usage of GoLang will enable a seamless evolution of the FNAA application. In future versions of the FNAA codebase, new functionalities leveraging Kubernetes will be easier to implement than if using a different programming language.</t>
        <t>When the FNAA server application is initialized, it provides debug log messages describing all client interactions. In order to start the server application, a Network Participant system administrator can download the binary and execute it in a terminal:</t>
        <t>ignatius ~ 0$./fnaad 
server.go:146: Listen on [::]:61000
server.go:148: Accept a connection request.</t>
        <t>Now that the 61000 TCP port is open, we can test the behaviour by means of a raw TCP using telnet command in a different terminal:</t>
        <t>ignatius ~ 1$telnet localhost 61000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 fnaa.unix.ar FNAA</t>
        <t>We can now see that the server has provided the first message in the connection: a welcome message indicating its FQDN fnaa.unix.ar.</t>
        <t>On the other hand, the server application starts providing debug information for the new connection established:</t>
        <t>ignatius ~ 0$./fnaad 
server.go:146: Listen on [::]:61000
server.go:148: Accept a connection request.
server.go:154: Handle incoming messages.
server.go:148: Accept a connection request.</t>
      </section>
      <section anchor="fnua-client-application">
        <name>7.3. FNUA - Client application</name>
        <t>In order to test the FNAA server application, a CLI-based FNUA application has been developed. The chosen language for this CLI tool is also GoLang. The reason for choosing GoLang for the FNUA is because of its functionalities for building CLI tools, leveraging on the Cobra library.
Thus, the FNUA for the PoC is an executable file that complies with the diagram in Figure 14.</t>
        <t>One of the requirements for the flow CLI tool is a configuration file that defines the different FNAA servers together with the credentials to use. An example of this configuration file follows:</t>
      </section>
      <section anchor="agents">
        <name>agents:</name>
        <t>name: fnaa-unix
fqdn: fnaa.unix.ar
username: test
password: test
prefix: unix.ar-
-
name: fnaa-emiliano
fqdn: fnaa.emiliano.ar
username: test
password: test
prefix: emiliano.ar-</t>
      </section>
      <section anchor="namespaces">
        <name>namespaces:</name>
        <t>name: flows.unix.ar
agent: fnaa-unix
-
name: flows.emiliano.ar
agent: fnaa-emiliano</t>
        <t>In this file, we can see that there are two FNAA instances described with FQDN fnaa.unix.ar and fnaa.emiliano.ar. Then, there are two namespaces: one called flow.unix.ar hosted on fnaa-unix and second namespace flows.emiliano.ar hosted on fnaa-emiliano. This configuration enables the FNUA to interact with two different FNAA, each of which is hosting different Flow Namespaces.</t>
        <t>Once the configuration file has been saved, the flow CLI tool can now be used. In the following sections, we will show how to use the minimum functionalities required for the Open Network using this CLI tool.</t>
      </section>
      <section anchor="use-cases">
        <name>7.4. Use cases</name>
        <t>### 7.4.1. Use case 1: Authenticating a user
After the connection is established, the first command that the client must execute is the authentication command. As previously defined in Chapter 5, every FNAA client must first authenticate in order to execute commands. Thus, the authentication challenge must be supported both by the FNAA as well as the FNUA.</t>
        <t>It is worth mentioning that the chosen authentication mechanism for this PoC is SASL Plain. This command can be extended furtherly with other mechanisms in later versions. However, this simple authentication mechanism is sufficient to demonstrate the authentication step in the FNAP.</t>
        <t>The SASL Plain Authentication implies sending the username and the password encoded in Base64. The way to obtain the Base64 if we consider a user test with password test, is as follows:
ignatius ~ 0$echo -en "\0test\0test" | base64
AHRlc3QAdGVzdA==</t>
        <t>Now, we can use this Base64 string to authenticate with the FNAA. First, we need to launch the FNAA server instance:</t>
        <t>ignatius~/ $./fnaad --config ./fnaad_flow.unix.ar.yaml
main.go:41: Using config file: ./fnaad_flow.unix.ar.yaml
main.go:57:     Using config file: ./fnaad_flow.unix.ar.yaml
server.go:103: Listen on [::]:61000
server.go:105: Accept a connection request.</t>
        <t>Then, we can connect to the TCP port in which the FNAA is listening:</t>
        <t>ignatius ~ 1$telnet localhost 61000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 fnaa.unix.ar FNAA
AUTHENTICATE PLAIN
220 OK
AHRlc3QAdGVzdA==
220 Authenticated</t>
        <t>Once the client is authenticated, it can start executing FNAP commands to manage the Flow Namespace of the authenticated user. For simplicity purposes, in this Proof of Concept, we will be using a single user.</t>
        <t>In the case of the CLI tool, there is no need to perform an authentication step, since every command the user executes will be preceded by an authentication in the server.</t>
        <section anchor="use-case-2-creating-a-flow">
          <name>7.4.2. Use case 2: Creating a flow</name>
          <t>Once the authentication is successful, the client can now create a new Flow.  The way to do this using the CLI tool would be:</t>
          <t>ignatius ~/ 0$./fnua create flow time.flow.unix.ar
Resolving SRV for fnaa.unix.ar. using server 172.17.0.2:53
Executing query fnaa.unix.ar. IN 33 using server 172.17.0.2:53
Executing successful: [fnaa.unix.ar.    604800  IN      SRV     0 0 61000 fnaa.unix.ar.]
Resolving A for fnaa.unix.ar. using server 172.17.0.2:53
Executing query fnaa.unix.ar. IN 1 using server 172.17.0.2:53
Executing successful: [fnaa.unix.ar.    604800  IN      A       127.0.0.1]
Resolved A to 127.0.0.1 for fnaa.unix.ar. using server 172.17.0.2:53
C: Connecting to 127.0.0.1:61000
C: Got a response: 220 fnaa.unix.ar FNAA
C: Sending command AUTHENTICATE PLAIN
C: Wrote (20 bytes written)
C: Got a response: 220 OK
C: Authentication string sent: AHRlc3QAdGVzdA==
C: Wrote (18 bytes written)
C: Got a response: 220 Authenticated
C: Sending command CREATE FLOW time.flow.unix.ar
C: Wrote (31 bytes written)
C: Server sent OK for command CREATE FLOW time.flow.unix.ar
C: Sending command QUIT
C: Wrote (6 bytes written)</t>
          <t>The client has discovered the FNAA server for Flow Namespace flow.unix.ar by means of SRV DNS records. Thus, it obtained both the FQDN of the FNAA together with the TCP port where it is listening, in this case 61000. Once the resolution process ends, the FNUA connects to the FNAA. First, the FNUA authenticates with the FNAA and then it executes the create flow command.</t>
          <t>If we were to simulate the same behavior using a raw TCP connection, the following steps would be executed:</t>
          <t>ignatius ~ 1$telnet localhost 61000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 fnaa.unix.ar FNAA
AUTHENTICATE PLAIN
220 OK
AHRlc3QAdGVzdA==
220 Authenticated
CREATE FLOW time.flows.unix.ar
220 OK time.flows.unix.ar</t>
          <t>Now, the client has created a new flow called time.flows.unix.ar located in the flows.unix.ar namespace. The FNAA in background has created a Kafka Topic as well as the necessary DNS entries for name resolution.</t>
        </section>
        <section anchor="use-case-3-describing-a-flow">
          <name>7.4.3. Use case 3: Describing a flow</name>
          <t>Once a flow has been created, we can obtain information of if by executing the following command using the CLI tool:</t>
          <t>ignatius ~/ 1$./fnua describe flow time.flow.unix.ar
Resolving SRV for fnaa.unix.ar. using server 172.17.0.2:53
Executing query fnaa.unix.ar. IN 33 using server 172.17.0.2:53
Executing successful: [fnaa.unix.ar.    604800  IN      SRV     0 0 61000 fnaa.unix.ar.]
Nameserver to be used: 172.17.0.2
Resolving A for fnaa.unix.ar. using server 172.17.0.2:53
Executing query fnaa.unix.ar. IN 1 using server 172.17.0.2:53
Executing successful: [fnaa.unix.ar.    604800  IN      A       127.0.0.1]
Resolved A to 127.0.0.1 for fnaa.unix.ar. using server 172.17.0.2:53
C: Connecting to 127.0.0.1:61000
C: Got a response: 220 fnaa.unix.ar FNAA
C: Sending command AUTHENTICATE PLAIN
C: Wrote (20 bytes written)
C: Got a response: 220 OK
C: Authentication string sent: AHRlc3QAdGVzdA==
C: Wrote (18 bytes written)
C: Got a response: 220 Authenticated
C: Sending command DESCRIBE FLOW time.flow.unix.ar
C: Wrote (33 bytes written)
C: Server sent OK for command DESCRIBE FLOW time.flow.unix.ar
Flow time.flow.unix.ar description:
flow=time.flow.unix.ar
type=kafka
topic=time.flow.unix.ar
server=kf1.unix.ar:9092
Flow time.flow.unix.ar described successfully
Quitting
C: Sending command QUIT
C: Wrote (6 bytes written)</t>
          <t>In the output of the describe command we can see all the necessary information to connect to the Flow called time.flow.unix.ar: (i) the type of Event Broker is Kafka, (ii) the Kafka topic has the same name of the flow and (iii) the Kafka Bootstrap server with port is provided. If we were to obtain this information using a manual connection, the steps would be:</t>
          <t>ignatius ~ 1$telnet localhost 61000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 fnaa.unix.ar FNAA
AUTHENTICATE PLAIN
220 OK
AHRlc3QAdGVzdA==
220 Authenticated
DESCRIBE FLOW time.flows.unix.ar
220 DATA 
flow=time.flows.unix.ar
type=kafka
topic=time.flows.unix.ar
server=kf1.unix.ar:9092
220 OK</t>
          <t>Now, we can use this information to connect to the Kafka topic and start producing or consuming events.</t>
        </section>
        <section anchor="use-case-4-subscribing-to-a-remote-flow">
          <name>7.4.4. Use case 4: Subscribing to a remote flow</name>
          <t>In this section, we will show how a subscription can be set up. When a user commands the FNAA to create a new subscription to a remote Flow, the local FNAA server first needs to discover the remote FNAA server. Once the server is discovered by means of DNS resolution, the local FNAA contacts the remote FNAA, authenticates the user and then executes a subscription command.</t>
          <t>Thus, the initial communication between the FNUA and the FNAA, in which the user indicates to subscribe to a remote flow, would be as follows:</t>
          <t>ignatius ~ 1$telnet localhost 61000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 fnaa.unix.ar FNAA
AUTHENTICATE PLAIN
220 OK
AHRlc3QAdGVzdA==
220 Authenticated
SUBSCRIBE time.flows.unix.ar LOCAL emiliano.ar-time.flows.unix.ar
220 DATA
ksdj898.time.flows.unix.ar
220 OK</t>
          <t>Once the user is authenticated, a SUBSCRIBE command is executed. This command indicates first the remote flow to subscribe to. Then, it also specifies with LOCAL the flow where the remote events will be written. In this example, the remote flow to subscribe to is time.flows.unix.ar, and the local flow is emiliano.ar-time.flows.unix.ar. Basically, a new flow has been created, emiliano.ar-time.flows.unix.ar, where all the events of flow time.flows.unix.ar will be written.</t>
          <t>The server answers back with a new Flow URI, in this case ksdj898.time.flows.unix.ar. This Flow URI indicates a copy of the original flow time.flows.unix.ar created for this subscription. Thus, the remote FNAA has full control over this subscription, being able to revoke it by simply deleting this flow or applying Quality of Service rules.</t>
          <t>The remote FNAA has set up a Bridge Processor to transcribe messages in topic time.flows.unix.ar to the new topic ksdj898.time.flows.unix.ar. Another alternative to a Bridge Processor would be a Distributor Processor, which could be optimized for a Flow with high demand. Moreover, instead of creating a single Bridge Processor per subscription, a Distributor Processor could be used, in order to have a single consumer of the source flow and write the events to several subscription flows.</t>
          <t>The user could use the FNUA CLI tool to execute this command in the following manner:</t>
          <t>ignatius ~ 0$./fnua --config=./flow.yml subscribe time.flows.unix.ar --nameserver 172.17.0.2 -d --agent fnaa-emiliano
Initializing initConfig
    Using config file: ./flow.yml
Subscribe to flow
Agent selected: fnaa-emiliano
Resolving FNAA FQDN fnaa.emiliano.ar
Starting FQDN resolution with 172.17.0.2
Resolving SRV for fnaa.emiliano.ar. using server 172.17.0.2:53
Executing query fnaa.emiliano.ar. IN 33 using server 172.17.0.2:53
FNAA FQDN Resolved to fnaa.emiliano.ar. port 51000
Resolving A for fnaa.emiliano.ar. using server 172.17.0.2:53
Resolved A to 127.0.0.1 for fnaa.emiliano.ar. using server 172.17.0.2:53
C: Connecting to 127.0.0.1:51000
C: Got a response: 220 fnaa.unix.ar FNAA
Connected to FNAA
Authenticating with PLAIN mechanism
C: Sending command AUTHENTICATE PLAIN
C: Wrote (20 bytes written)
C: Got a response: 220 OK
C: Authentication string sent: AHRlc3QAdGVzdA==
C: Wrote (18 bytes written)
C: Got a response: 220 Authenticated
Authenticated
Executing command SUBSCRIBE time.flows.unix.ar LOCAL emiliano.ar-time.flows.unix.ar
C: Sending command SUBSCRIBE time.flows.unix.ar LOCAL emiliano.ar-time.flows.unix.ar
C: Wrote (67 bytes written)
C: Server sent OK for command SUBSCRIBE time.flows.unix.ar LOCAL emiliano.ar-time.flows.unix.ar
Flow emiliano.ar-time.flows.unix.ar subscription created successfully
Server responded: emiliano.ar-time.flows.unix.ar SUBSCRIBED TO ksdj898.time.flows.unix.ar
Quitting
C: Sending command QUIT
C: Wrote (6 bytes written)
Connection closed</t>
          <t>This interaction of the FNUA with the FNAA of the Flow Namespace emiliano.ar (fnaa-emiliano) has trigger an interaction with the FNAA of unix.ar Flow Namespace (fnaa-unix). This means that before fnaa-emiliano was able to respond to the FNUA, a new connection was opened to the remote FNAA and the SUBSCRIBE command was executed.</t>
          <t>The log of fnaa-emiliano when the SUBCRIBE command was issued looks as follows:</t>
          <t>server.go:111: Handle incoming messages.
server.go:105: Accept a connection request.
server.go:253: User authenticated
server.go:347: FULL COMMAND: SUBSCRIBE time.flows.unix.ar LOCAL emiliano.ar-time.flows.unix.ar
server.go:401: Flow is REMOTE
client.go:280: **#Resolving SRV for time.flows.unix.ar. using server 172.17.0.2:53
server.go:417: FNAA FQDN Resolved to fnaa.unix.ar. port 61000
client.go:42: C: Connecting to 127.0.0.1:61000
client.go:69: C: Got a response: 220 fnaa.unix.ar FNAA
server.go:435: Connected to FNAA
server.go:436: Authenticating with PLAIN mechanism
client.go:126: C: Sending command AUTHENTICATE PLAIN
client.go:133: C: Wrote (20 bytes written)
client.go:144: C: Got a response: 220 OK
client.go:154: C: Authentication string sent: AHRlc3QAdGVzdA==
client.go:159: C: Wrote (18 bytes written)
client.go:170: C: Got a response: 220 Authenticated
server.go:444: Authenticated
client.go:82: C: Sending command SUBSCRIBE time.flows.unix.ar
client.go:88: C: Wrote (30 bytes written)
client.go:112: C: Server sent OK for command SUBSCRIBE time.flows.unix.ar
server.go:456: Flow time.flows.unix.ar subscribed successfully
server.go:457: Server responded: ksdj898.time.flows.unix.ar
server.go:459: Quitting</t>
          <t>We can see how fnaa-emiliano had to trigger a client subroutine to contact the remote fnaa-unix. Once the server FQDN, IP and Port is discovered by means of DNS, a new connection is established and the SUBSCRIBE command is issued. Here we can see the log of fnaa-unix:</t>
          <t>server.go:111: Handle incoming messages.
server.go:105: Accept a connection request.
server.go:253: User authenticated
server.go:139: Received command: subscribe
server.go:348: [SUBSCRIBE time.flows.unix.ar]
server.go:367: Creating flow endpoint time.flows.unix.ar
server.go:368: Creating new topic ksdj898.time.flows.unix.ar in Apache Kafka instance kafka_local
server.go:369: Creating Flow Processor src=time.flows.unix.ar dst=ksdj898.time.flows.unix.ar
server.go:370: Adding DNS Records for ksdj898.time.flows.unix.ar
server.go:372: Flow enabled ksdj898.time.flows.unix.ar
server.go:139: Received command: quit</t>
          <t>Thus, we were able to set up a new subscription in fnaa-emiliano that trigger a background interaction with fnaa-unix.</t>
        </section>
        <section anchor="results-of-the-poc">
          <name>7.5. Results of the PoC</name>
          <t>We can confirm the feasibility of the overall Event Streaming Open Network architecture. The test of the proposed protocol FNAP and its implementation, both in the FNAA and FNUA (CLI application), show that the architecture can be employed for the purpose of distributed subscription management among Network Participants.</t>
          <t>The minimum functionalities defined both for the Network Participants and the Users were met. Network Participants can run this type of service by means of a server application, the FNAA server. Also, the CLI-tool resulted in a convenient low-level method to interact with a FNAA server.</t>
          <t>In further implementations, the server application should be optimized as well as secured, for instance with a TLS handshake. Also, the CLI-tool could be enhanced by a web-based application with a friendly user interface.</t>
          <t>Nevertheless, the challenge for a stable implementation of both components is the possibility of supporting different Event Brokers and their evolution. Not only Apache Kafka should be supported but also the main Public Cloud providers events solutions, such as AWS SQS or Google Cloud Pub/Sub. Since the Event Brokers are continuously evolving, the implementation of the FNAA component should keep up both with the API and new functionalities of these vendors.</t>
          <t>Regarding the protocol design, it would be needed to enhance the serialization of the exchanged data. In this sense, it could be convenient to define a packet header for the overall interaction between the FNAA both with remote FNAA as well as with FNUA.</t>
          <t>Regarding the subscription use case, it would be necessary to establish a convenient format for the server response. Currently, the server is returning a key/value structure with the details of the Flow. This structure may not be the most adequate, since it may differ depending on the Event Broker used.</t>
          <t>Also, the security aspect needs further analysis and design since its fragility could lead to great economical damage for organizations. Thus, it would be recommended to review the different security controls needed for this solution as part of an Information Security Management System.</t>
          <t>Finally, the implementation should leverage the Cloud Native functionalities provided by the Kubernetes API. For example, the FNAA should trigger the deployment of Flow Processors on demand, in order to provide isolated computing resources for each subscription. Also, a Kubernetes resource could be developed to use the kubectl CLI tool for management, instead of a custom CLI tool.</t>
        </section>
        <section anchor="summary-conclusions">
          <name>8. Summary &amp; Conclusions</name>
          <t>In this chapter we will provide a summary of everything that has been described in this document as well as some conclusions about it.</t>
          <t>We have identified a use case for which there is currently no adequate solution provided by existing tools. This use case is based on the cross-organization integration of real-time event streams. Nowadays, organizations intending to integrate these kind of data streams struggle with offline communication to achieve a common interface for integration. In this context, we proposed an Open Network for Event Streaming as a possible solution for this difficulty.</t>
          <t>For this Open Network, we have followed the main necessities from the technical perspective. While there already exist many components that can be leveraged, some components require analysis, design, and implementation. Then, we referred to the Commons Infrastructure literature in order to show how Event Streaming can be considered an Infrastructure Resource that can enable downstream productive activities. Finally, we established the main guidelines that an Open Network should follow, basing these definitions on Free, Open &amp; Neutral Networks.</t>
          <t>Using the previous definitions, we have designed an architecture for the Event Streaming Open Network, establishing the components that the different Network Participants should implement in order to participate in the network. After providing a thorough description of all the components, we showed some use cases of integration among different Network Participants.</t>
          <t>Once the architecture was defined, we proposed an implementation approach which describes the existing components that can be leveraged as well as those that need to be developed from scratch. The outcome was that a server-side application called FNAA had to be developed. This application implements the protocol FNAP and can be accessed by a client application, which we named FNUA.</t>
          <t>Finally, we proved the feasibility of the proposed architecture by providing an implementation of the minimum functionalities required, in the form of a Proof of Concept. The results of this PoC were encouraging since it was possible to implement the initial functionalities for the FNAA and FNUA components.</t>
          <t>As conclusion, we can mention that there is great potential for an Open Network for Event Streaming among organizations. In the same way the email infrastructure acts as an open network for electronic communications among people, this kind of network would enable developers to integrate real-time event streams while minimizing offline agreement of interfaces and technologies.</t>
          <t>However, there are many difficulties that could be furtherly worked on. First, a robust implementation for the Event Streaming Open Network main components must be provided, mainly for the FNAA and FNUA. In order to achieve an acceptable level of quality and stability, the development of a community around the project is needed.</t>
          <t>Secondly, we found that the proposed architecture is a convenient starting point. However, it can suffer modifications based on the learning process during the implementation. For example, while designing the architecture, we avoided the need of a database for the FNAA component, leveraging on the DNS infrastructure. While this can be sufficient for the minimum functionalities described, it will most probably be necessary for the FNAA to persist data in a database of its own. In this sense, we believe that leveraging the Kubernetes resources model could be a convenient alternative.</t>
          <t>Thirdly, during the PoC execution, we identified some difficulties implementing the security functionalities of authentication and authorization. Although we were able to implement an authentication mechanism, the reality indicates that integration with well-established protocols is needed (i.e., OAuth, GSSAPI, etc.).</t>
          <t>Finally, there is also the need to leverage on the Cloud Native architecture, basically Kubernetes, to provide hyper-scalability and enable Network Participants to agnostically choose the underlaying infrastructure. The selection of Golang for the PoC implementation showed to be convenient, given the vast number of available libraries for integration of third-party components and services.</t>
          <t>Notwithstanding the difficulties, we firmly believe that cross-organization real-time event integration can provide great benefits for society. It would enhance the efficiency of business processes throughout organizations. Also, it would provide broad visibility to the final users, enabling experimentation and entrepreneurship. New business models for existing productive activities could be developed, as well as enabling innovation, which in turn would conform the positive externalities of the Event Streaming Open Network.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner">
            <organization/>
          </author>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba">
            <organization/>
          </author>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>URQUHART J. (2021) Flow Architectures 
FRISCHMANN B. (2007) [Online] Infrastructure Commons in Economic Perspective &lt; https://firstmonday.org/article/view/1901/1783&gt;
WIDL M. (2013), Guided Merging of Sequence Diagrams
NAVARRO L. (2018) [Online] Network Infrastructures: The commons model for local participation, governance and sustainability <eref target="https://www.apc.org/en/pubs/network-infrastructures-commons-model-local-participation-governance-and-sustainability">https://www.apc.org/en/pubs/network-infrastructures-commons-model-local-participation-governance-and-sustainability</eref>
BRINO A. (2019) Towards an Event Streaming Service for ATLAS data processing.
GUTTRIDGE, Gartner (2021) "Modern Data Strategies for the Real-time Enterprise" Big Data Quarterly 2021</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIABnm8WEAA+29/XIb2ZUn+D+eIlee6JYcICSS+ira5RiIlKo4LVEskXLN
hNfrSAAJMi0gE5UJiEL19oRfYyO6I/ZZ9lH8JHu+77k3EyRl967bM+OZtkUy
8+b9OPd8n9/Z29sbrMv1ojjKHrz+XFTr7GLdFPmyrK6y96uiys6K9U3dfHow
yCeTpviMj128P3swmObr4qputkdZWc3rwWBWT6t8CcPMmny+3mtXZVUsFvle
gYPutTroXg2D7lU86N6TJ4Ny1Rxl62bTrg+ePPnmycEghyePsstXJwN85Kqp
Nyv+8VOxhd/MjrLTal00MMTeCX5qAB/YFEeDLHPPZtl6uyr038u8XOi/82Z6
rf++KtfXm8lR1m6rWVHVj79i6vD2AnagXR9l1+v1qj16/Lj4ki9Xi2I0rZeP
344vX19cDgbtOq9mf8gXdQWT2RbtoF3mzfoPP21qePcoq+rBqjzKfreup8Os
rRv41LyFf22X+I/fDwb5Zn1dN7C4PfhglvEOP3i9LBdlXtXZhUz1Af21bq7y
qvw5X5d1dZRd8KLoLwXvwINCXhzpGv+zLB0n/WAwqOpmCa9/hu0c4LGGnwZ7
e3tZPoHNyKfrweDyumwzOPLNEklmVrTTppwUbba+LrLPZQsTGNJOl+tiut40
RQbbkMnWZaumhgXXiww+AH/IbqO7rP5cNDSsnvqI57IsZ7NFMRj8Itsf4d+a
eraZ4soHg4t6WhbrbQZTbPJVOVtss1kJZ50vyp9xfJwLbGyNi4MfcfDiy/Q6
r65gBfU8+5wvNgX8Ol9n07pq4Xps1gU/Bj/Xy+0oGy/aekh/LWdFk08W8Pdy
ycssqqK5oq+3K1zYus7ytsVNoCGBjIHe86rNabptNoUtmOAUiil8Z5bdAFVm
TQHLgR+uN0v4c1l9rhefC9ps+vOkWMNuDLN53tL/4neXNe7zdLppgDBhgHaz
WLe4N/BdmAxMdl18WQ87243fXy3ybZbT3JoaFlNW2XV949ZcToEq4VvLrKCp
tHAM39c3cEXg68u6XePG4eP5arUop0SDcEO2cHglfPeqyXmxtsp1PcNPTpu6
bSPKzRfZpN5Us7wp4TiAG8AtWeOEYL4L2mXdfvjcNoPlNrAeOOOm+GlTwuMF
3MJ6SwcNR9kQKcDkmJpb2iqlQNiei3qJy50BA6IPXuefYRGzeoWTnOXr3F5E
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

-->

</rfc>
