<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fran Méndez 🍺</title>
    <description>The latest articles on DEV Community by Fran Méndez 🍺 (@fmvilas).</description>
    <link>https://dev.to/fmvilas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F19570%2F79c0d75f-cec6-4bb1-ad69-c165d311ca31.jpeg</url>
      <title>DEV Community: Fran Méndez 🍺</title>
      <link>https://dev.to/fmvilas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fmvilas"/>
    <language>en</language>
    <item>
      <title>Status update (week 11, 2019)</title>
      <dc:creator>Fran Méndez 🍺</dc:creator>
      <pubDate>Thu, 14 Mar 2019 19:34:37 +0000</pubDate>
      <link>https://dev.to/fmvilas/status-update-week-11-2019-b85</link>
      <guid>https://dev.to/fmvilas/status-update-week-11-2019-b85</guid>
      <description>&lt;p&gt;Olà amigos! This is an exciting week for us. &lt;a href="https://solace.com"&gt;Solace&lt;/a&gt; joined the AsyncAPI Initiative as a &lt;a href="https://opencollective.com/asyncapi"&gt;Platinum Sponsor&lt;/a&gt; 🎉. Thank you, &lt;a href="https://twitter.com/JSchabowsky"&gt;Jonathan Schabowsky&lt;/a&gt;, for leading the process. And if that’s not enough, we finished our “&lt;a href="https://github.com/asyncapi/asyncapi/milestone/2?closed=1"&gt;Protocol mappings&lt;/a&gt;” milestone. Keep reading!&lt;/p&gt;

&lt;h2&gt;
  
  
  Latest changes in the specification
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/asyncapi/asyncapi/issues/42"&gt;Protocol-specific information&lt;/a&gt;. This is a long-awaited feature. It allows you to define protocol-specific information in channels, operations, and messages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/asyncapi/asyncapi/issues/112"&gt;Separate application headers from protocol headers&lt;/a&gt;. From now on, all the protocol-related headers must be included in a &lt;code&gt;protocolInfo&lt;/code&gt; object, and the existing message &lt;code&gt;headers&lt;/code&gt; must be used only for application headers, if any.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/asyncapi/asyncapi/issues/171"&gt;Annotate a channel parameter as multi-level&lt;/a&gt;. Do you want to tell your code a specific parameter should span across multiple levels? Now you can annotate channel parameters to indicate that. Pretty much like the &lt;code&gt;#&lt;/code&gt; (pound) symbol in AMQP and MQTT or the &lt;code&gt;&amp;gt;&lt;/code&gt; (greater than) symbol in NATS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/asyncapi/asyncapi/issues/172"&gt;Unify examples fields&lt;/a&gt;. In the past, we had the &lt;code&gt;example&lt;/code&gt; field in schemas and the &lt;code&gt;examples&lt;/code&gt; field in some other places of the specification. They are now unified using the plural form and allowing for more than an example per object. However, we didn’t remove the support for &lt;code&gt;example&lt;/code&gt; field in schemas, since we want to remain compatible with OpenAPI schemas.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2LUX-Fnv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/t6vuotpn6a5jup9yc0wp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2LUX-Fnv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/t6vuotpn6a5jup9yc0wp.png" alt="Cumulative flow chart showing the progress of AsyncAPI 2.0.0."&gt;&lt;/a&gt;&lt;/p&gt;
Cumulative flow chart showing the progress of AsyncAPI 2.0.0.



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IofvrH0x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n5y7rvy96ixwaix85g7h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IofvrH0x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n5y7rvy96ixwaix85g7h.png" alt="Release report showing the planned and predicted end dates. We’re 38 days ahead of plan! 🔥"&gt;&lt;/a&gt;&lt;/p&gt;
Release report showing the planned and predicted end dates. We’re 38 days ahead of plan! 🔥



&lt;h2&gt;
  
  
  Donate
&lt;/h2&gt;

&lt;p&gt;And last but not least, we’ve completed our first three weeks running the sponsorship campaign. We greatly appreciate the support from &lt;a href="https://solace.com"&gt;Solace&lt;/a&gt; and look forward to working together. You’ll hear more exciting news in the upcoming weeks. Stay tuned!&lt;/p&gt;

&lt;p&gt;Remember, we’ve got different tiers so that everybody can show their love! ❤️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opencollective.com/asyncapi"&gt;Donate here&lt;/a&gt;. Help Open Source projects.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;“Give yourself permission to slow down. You can speed up by slowing down.”&lt;/p&gt;

&lt;p&gt;— Gabby Bernstein&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;See you next week, folks! 👋&lt;/p&gt;

</description>
      <category>asyncapi</category>
      <category>solace</category>
      <category>opensource</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Event-Driven Architectures &amp; AsyncAPI</title>
      <dc:creator>Fran Méndez 🍺</dc:creator>
      <pubDate>Thu, 26 Oct 2017 11:05:46 +0000</pubDate>
      <link>https://dev.to/fmvilas/event-driven-architectures--asyncapi-db7</link>
      <guid>https://dev.to/fmvilas/event-driven-architectures--asyncapi-db7</guid>
      <description>&lt;p&gt;We, as engineers, often forget that APIs are not just HTTP APIs. We got so used to think about HTTP and REST APIs that we even have to stop for a moment to remember what the API term means. API stands for &lt;em&gt;”Application Programming &lt;strong&gt;Interface&lt;/strong&gt;”&lt;/em&gt;. It’s exactly on the &lt;em&gt;“Interface”&lt;/em&gt; piece where I want to focus. According to Oxford Dictionaries, an interface is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A point where two systems, subjects, organizations, etc. meet and interact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In software engineering, high-quality architectures always go hand in hand with well-defined interfaces and responsibility boundaries. Likewise, poorly-defined interfaces and boundaries are frequently the top reason for a bad design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Event-Driven Architectures
&lt;/h2&gt;

&lt;p&gt;When designing Event-Driven Architectures (EDA), you are also building APIs. These APIs will sit in the boundaries of your services and will allow them to communicate.&lt;/p&gt;

&lt;p&gt;Topics and messages are first-class citizens because they precisely represent services interfaces. Consider the following example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Foprf1q5igrhcejazg7ig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Foprf1q5igrhcejazg7ig.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Email Service expects to receive a message on &lt;code&gt;users/created&lt;/code&gt; topic. The message must contain information about the user's name and email, to be able to send a proper welcome email.&lt;/p&gt;

&lt;p&gt;Can you imagine what happens if we change the Accounts Service and now it sends the message via the &lt;code&gt;accounts/created&lt;/code&gt; topic? Or what if we change the message and now it specifies the email in an &lt;code&gt;emailAddress&lt;/code&gt; field instead of &lt;code&gt;email&lt;/code&gt;? In the first case, the message will never reach the Email Service so, you will not get an error, but the system will stop working correctly. In the second case, the message will be malformed from the Email Service point of view.&lt;/p&gt;

&lt;p&gt;As you can see, topics and messages are the interfaces of our services, and so we have to care about them, especially as the number of services grows. We should pay attention in the same way we do with endpoints, and requests and response payloads in our HTTP APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  AsyncAPI
&lt;/h2&gt;

&lt;p&gt;AsyncAPI provides a specification that allows you to define Message-Driven APIs in a machine-readable format. The spec is very similar to OpenAPI/Swagger so, if you’re familiar with them, AsyncAPI should be easy for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;p&gt;Your API definition consists of a file, or a set of them, where you define the topics, messages, servers, and more. You can afterward use the file(s) to create documentation, tooling or for whatever you need it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use cases
&lt;/h3&gt;

&lt;p&gt;There are many use cases where AsyncAPI can be helpful, mostly to generate human-readable documentation and bootstrap code for your API. However, other use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documentation-first development&lt;/strong&gt;: Your API implementation doesn’t change unless you change its documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API testing&lt;/strong&gt;: Since you have all the API information, you could easily generate integration tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API management&lt;/strong&gt;: You can build API management solutions gathering information from AsyncAPI files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: You can create tooling to help you monitor your APIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Getting started
&lt;/h3&gt;

&lt;p&gt;A simple and straightforward way to get started with AsyncAPI is to play with the &lt;a href="http://editor.asyncapi.org" rel="noopener noreferrer"&gt;online editor&lt;/a&gt;. Though, if you’re in the mood for coding, take a look at the &lt;a href="https://asyncapi.org" rel="noopener noreferrer"&gt;asyncapi.org&lt;/a&gt; website and &lt;a href="https://www.asyncapi.com/v1/tutorial/" rel="noopener noreferrer"&gt;tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Further resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/asyncapi/docgen" rel="noopener noreferrer"&gt;AsyncAPI HTML documentation generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Mermade/widdershins" rel="noopener noreferrer"&gt;AsyncAPI Slate/Shins documentation generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.slideshare.net/fmvilas/asyncapi-specification" rel="noopener noreferrer"&gt;API:World 2017 slides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tech</category>
      <category>programming</category>
      <category>microservices</category>
      <category>api</category>
    </item>
    <item>
      <title>Introducing the AsyncAPI specification</title>
      <dc:creator>Fran Méndez 🍺</dc:creator>
      <pubDate>Tue, 23 May 2017 11:16:30 +0000</pubDate>
      <link>https://dev.to/fmvilas/introducing-the-asyncapi-specification</link>
      <guid>https://dev.to/fmvilas/introducing-the-asyncapi-specification</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://blog.hitchhq.com/introducing-the-asyncapi-specification-7feb57b460ae"&gt;blog.hitchhq.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We’re proud to launch an open-source initiative that we’ve been working on for months here at &lt;a href="https://www.hitchhq.com"&gt;Hitch&lt;/a&gt;, the &lt;a href="https://www.asyncapi.org"&gt;AsyncAPI specification&lt;/a&gt;. An OpenAPI-like specification for asynchronous APIs.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.asyncapi.org"&gt;AsyncAPI specification&lt;/a&gt; is protocol-agnostic, so you can use it for APIs that work over MQTT, AMQP, WebSockets, STOMP, etc. Basically, IoT APIs and asynchronous microservices.&lt;/p&gt;

&lt;p&gt;The specification is heavily inspired on &lt;a href="https://github.com/OAI/OpenAPI-Specification"&gt;OpenAPI&lt;/a&gt; (aka Swagger) and it’s designed to maintain as much compatibility as possible with it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why another specification?
&lt;/h1&gt;

&lt;p&gt;At &lt;a href="https://www.hitchhq.com"&gt;Hitch&lt;/a&gt; we’re in love with API machine-readable documentation formats (OpenAPI, RAML, etc.). We always encourage our customers to use a machine-readable definition for their APIs because of its numerous benefits. From better documentation and code generation to scalable API support.&lt;br&gt;
Internally, we use a message-driven microservices architecture and we couldn’t have all those tools that we have with the HTTP APIs. Things you get because you have your API defined with a machine-readable documentation format. And, on top of that, at the same time we noticed that some of our customers were creating IoT APIs over MQTT and they couldn’t get all the benefits from Hitch because the existing specifications don’t support message-driven APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It was time to come up with something good enough for everyone instead of having every company fighting its own battle. We can learn a lot together if we join forces. Let’s start!&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A basic example
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Email service
&lt;/h3&gt;

&lt;p&gt;This example describes a very basic email service. It sends an email every time a new user signs up. It subscribes for the &lt;code&gt;hitch.accounts.1.0.event.user.signup&lt;/code&gt; event and, when received, sends the email and publishes a new message notifying the system that the email has been sent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;asyncapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1.0.0'&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Sign&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;up&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;example'&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1.0.0'&lt;/span&gt;
&lt;span class="na"&gt;baseTopic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hitch'&lt;/span&gt;
&lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;asyncapi.hitchhq.com'&lt;/span&gt;
&lt;span class="na"&gt;schemes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;amqp'&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mqtt'&lt;/span&gt;

&lt;span class="na"&gt;topics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;accounts.1.0.event.user.signup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;subscribe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/messages/userSignedUp'&lt;/span&gt;
  &lt;span class="na"&gt;email.1.0.event.email.sent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;publish&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/messages/emailSent'&lt;/span&gt;

&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;emailSent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Email&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sent&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;user.'&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;notifying&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;an&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;has&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;been&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sent.'&lt;/span&gt;
      &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;object'&lt;/span&gt;
        &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/user'&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/content'&lt;/span&gt;

    &lt;span class="na"&gt;userSignedUp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;has&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;signed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;up.'&lt;/span&gt;
      &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;object'&lt;/span&gt;
        &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/user'&lt;/span&gt;
          &lt;span class="na"&gt;signup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/signup'&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content'&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;The&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;content'&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;string'&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id'&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Resource&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;identifier'&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;string'&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;username'&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;User&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;handle'&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;string'&lt;/span&gt;
    &lt;span class="na"&gt;datetime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;datetime'&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Date&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Time&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;message'&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;string'&lt;/span&gt;
      &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;date-time'&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;object'&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id'&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;username'&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;User&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Id'&lt;/span&gt;
          &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/id'&lt;/span&gt;
        &lt;span class="na"&gt;full_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User's&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;full&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;name"&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;string'&lt;/span&gt;
        &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/username'&lt;/span&gt;
    &lt;span class="na"&gt;signup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;object'&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;method'&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;datetime'&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Signup&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;method'&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;string'&lt;/span&gt;
          &lt;span class="na"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email'&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;facebook'&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;twitter'&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;github'&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;google'&lt;/span&gt;
        &lt;span class="na"&gt;datetime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/datetime'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are familiar with the OpenAPI specification I’m sure you already found lots of similarities. But, what’s this &lt;code&gt;topics&lt;/code&gt; section in the code? And what's this &lt;code&gt;accounts.1.0.event.user.signup&lt;/code&gt;? Let's dive into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core concepts
&lt;/h2&gt;

&lt;p&gt;The AsyncAPI specification is based on the assumption of two core concepts:&lt;/p&gt;

&lt;h3&gt;
  
  
  Messages
&lt;/h3&gt;

&lt;p&gt;The way consumers can communicate with your API is based on messages. A message is a piece of information two or more programs exchange. Most of the times to notify the other end(s) that, either an event has occurred or you want them to perform an action.&lt;/p&gt;

&lt;p&gt;Technically speaking the events and actions will always be sent in the same way. These are just messages and their content can be anything. So when we speak about the difference between &lt;strong&gt;events&lt;/strong&gt; and &lt;strong&gt;actions&lt;/strong&gt;, this is just a semantic differentiation of the content of the message. We do not enforce you to make any difference between them (although we encourage you to do it).&lt;/p&gt;

&lt;p&gt;Martin Fowler’s talk on event-driven architectures at GOTO&lt;br&gt;
A message can contain headers and a payload, however both are optional. To remain as much protocol-agnostic as possible, the specification allows you to define any kind of header.&lt;/p&gt;

&lt;h3&gt;
  
  
  Topics
&lt;/h3&gt;

&lt;p&gt;Message-driven protocols usually contain something that can be found as a topic (&lt;a href="http://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices"&gt;MQTT&lt;/a&gt;), routing key (AMQP), destination (STOMP), etc. To some extent, they can compare to URLs in HTTP APIs. So when you send a message to your API it will be routed depending on the topic you published it on. It allows you to create APIs that subscribe to certain topics and publish to other ones.&lt;/p&gt;

&lt;p&gt;There’s no standard way of naming topics so we recommend you to &lt;a href="https://github.com/asyncapi/topic-definition"&gt;have a look at our proposal here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooling
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Code generators
&lt;/h3&gt;

&lt;p&gt;So far we only have a code generator for Node.js (&lt;a href="https://github.com/asyncapi/node-codegen"&gt;github.com/asyncapi/node-codegen&lt;/a&gt;). We would like to have you involved in &lt;a href="https://github.com/asyncapi/asyncapi/issues/new?labels%5B%5D=Code%20Generator%20Request"&gt;generating one for your programming language of choice&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation generators and API support
&lt;/h3&gt;

&lt;p&gt;Are you interested in generating documentation for your AsyncAPI and/or setting up the Hitch API Assistant? We can definitely help! Drop us a line at &lt;a href="//mailto:hi@hitchhq.com"&gt;hi@hitchhq.com&lt;/a&gt; and we’ll get back to you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusions
&lt;/h3&gt;

&lt;p&gt;The AsyncAPI specification will let us improve the interoperability and tooling around this type of APIs. Either it’s for the Internet of Things or for internal asynchronous microservices, we believe this will make the difference in the future of async APIs.&lt;/p&gt;

</description>
      <category>api</category>
      <category>async</category>
      <category>microservices</category>
      <category>iot</category>
    </item>
  </channel>
</rss>
