Abstract
Picture this: Gopher enters a multilingual playground and wants to communicate with other applications and things but is perplexed with the plethora of messaging protocols and APIs! Attend this talk to see how one can adopt a protocol and language agnostic event-driven architecture using GoLang.
In this talk, Tamimi be covering a high-level overview of what an event-driven architecture (EDA) is and its relevance to real-world use-cases. Then, he will be delving into how asynchronous operational use-cases behaviours are handled in GoLang such as a stream of events that requires real-time processing, for example: stock price ticker, traffic data, aviation data, inventory management, etc.
Through this, Tamimi will highlight the benefits and drawbacks to using Go for such use-cases and how a native go messaging API could resolve the common issues.
Attendees will leave this session with an understanding of:
- Asynchronous Event APIs vs Synchronous REST APIs
- The challenges with using EDA when it comes to different messaging protocols and open standard messaging APIs
- Using messaging APIs in GoLang to integrate Go microservices in EDA
If you are in a space that requires real-time processing of data and want to use Go as the choice of programming language to develop your application, then this talk is definitely
for you!
Transcript
This transcript was autogenerated. To make changes, submit a PR.
What if you could work with some of the world's most innovative companies,
all from the comfort of a remote workplace?
Andela has matched thousands of technologists across the globe to their
next career adventure. We're empowering new talent worldwide,
from Sao Paulo to Egypt and Lagos to Warsaw.
Now the future of work is yours to create.
Anytime, anywhere, the world is at your fingertips.
This is Andela.
Hey everyone, my name is Tamimi. Thanks for coming to my talk.
I'm super excited for today's presentation because
it's a topic that is near and dear to my heart.
We're going to be talking about gopher in an event driven playground
and hopefully you'll have a combination of slides and hands
on demo and then some interactions on the Discord channel.
So let's get right into it. I'm hoping
towards the end of this talk you will get an idea
on what is an event driven system, how go fits
in an event driven world by talking
about existing messaging protocols, frameworks and tools that
can be used in Golang, highlight the potential challenges behind
using go and the existing messaging graph protocols,
and finally, showcase the new solace pubsa plus messaging
API for Golang and how y'all can get your hands on it.
Today's topic will be pretty light hearted and fun.
So let's assume that our cute little gopher
is walking around in a playground. In the real world,
there are other animals that communicate in different languages and protocols.
Some animals are not even on the ground and they're just hovering in
the clouds. And gopher is wondering, how can I communicate
with these other animals? How can I send and receive
information from these creatures?
So these animals could be other microservices and applications
either within the same ecosystem or other ecosystems.
There are different languages, whether it's Java, Python, C, Ruby,
JavaScript, or even go from these microservices. These microservices
communicate with different protocols, whether it's rest over HTTP,
MQTT, AMQP, there's open standards like JMS.
There are other things around as well
that communicate. Whether there are sensors, there are applications
that are on ground or on cloud.
So Gopher is wandering around
in this playground looking for friends to help
him answer the question. And he meets Soli the Otter and starts the conversation.
Hi Soli, how can I accomplish a language and protocol
agnostic real time communication with other microservices?
You can use an event driven architecture approach, but what is
an event driven architecture? Follow along. Let me tell you what
event driven architecture is. Event driven architectures involve asynchronous
communication between applications via publishing and
subscribing to events over an event broker using
a messaging protocol. Gopher is getting a bit
interested. Messaging protocol basically is a structured
way for applications to exchange payloads with other applications.
These protocols can describe the way that the
message being processed,
prioritization, routing, security,
access control are some of the many things that a
messaging protocol is involved with.
So in a nutshell, to animate this concept,
you have publishers that publish messages on a predefined topic
to brokers and subscribers subscribe to topics and the brokers can
handle the routing. So this is fundamentally what a
pub sub system at its base looks
like. A real world use case of an
event driven architecture involves several applications,
multiple protocols, applications that are developed in different languages
and different form factors of deployment between on premise
public cloud and private cloud deployment. So think
of the green lines you can see here on the diagram as
a central nervous system for everything that happens across
your business, whether you have different forms of deployment.
This is basically the interaction between the different form
factors. All right, so let's go back to the conversation between
Gopher and Sally. Gopher wants real world examples.
Do you do any online shopping? Do you trade on the stock market?
Do you track airplanes in real time? All these
are examples of event driven architectures. Another example of
a scenario where event driven architectures are
deployed. So let's pretend that there's
a customer that places an order on a mobile phone, they click the
but button and that triggers a series of actions. Behind the
scenes digital events are being triggered. So let's
say to check and confirm and update the back end inventory
system, you have a payment that needs to be authorized,
you need to start a shipment process. What if
the company that you're working with has a loyalty program that also
gets triggered at every purchase order and we want to update
the customer data platform. So all this happens in real time and
triggered from one event. So these
applications that you look at. So another example,
let's say that you have event producers that generate
events through purchase requires the mobile application,
the point of sale system, ecommerce websites, they're all different microservices
that publishes events. These microservices or applications,
keep in mind, could be developed in different languages, communicate over
different protocols, but they all publish events to a network of
event brokers. And this is what we're going to call an event mesh.
On the other side, there are other microservices that subscribe to these events,
whether you're a warehouse, database, finance, microservices,
customer service. And these are event consumers that subscribe to
relevant topics and react based
on whatever the topic is and the payload of the
topic is. So let's talk about kind of
MQTT and this is one
of the many messaging protocols, open standard messaging protocols
that could be used in an event driven architecture. So Soli is
coming here to talk about what MQTT is. It's a simple lightweight messaging protocol
based on the pubsub model. It is an Oasis
standard messaging protocol for IAT devices. You can read more about
it@mqtt.org and I'm going
to give you a quick hands on demo on how to use
mqtt using the Paho Go mqtt library
and have a simple pub sub application written
in go. So basically what I'll be doing is I will be initializing
a directory and installing
the go MqtT library.
From there I will configure my application to connect to an MQtT
broker, subscribe to a topic, publish messaging on a
topic and show what message handlers are all
about and callback functions. So let's go ahead into this
demo and I'll be back. Let's go ahead and create a
new directory and call it conf 42 demo
navigate to it. I'm going to initialize this
as a go project and
install the dependency go get so
what I did right now is installed the Paho mqtt
Golang. Let's open this project.
So what I will do is create a new file, call it main
go. In this file I
will import the packages that I want.
So this is a package main and I will
be using mqtt from the Paho
mqtt Golang package.
I have a main program, a very simple main programming
written here. So I define the broker
as a MqtT broker. I'm using a solace
cloud instance and the port
one eight three is the exposed mqtt
port. I set the username password
and assign a callback functions
right here for the MqtT client. These callback
functions, I will define them shortly. They are
callback functions for when successful connection happens
and any message comes in. So let's go ahead and define
these callback functions.
So what do we have? Right here is
a message handler for every time the MQtc
client receives a message. We have callback
functions for successful connection and lost connection to
the broker. So right now after this, what we want to do is
define a publish and subscribe functions.
So let's go ahead and create this.
So my publish function basically takes an MQtT
client and publishes ten messages
with a 1 second sleep.
And the body of the message is
the number that this
message is in the subscribe function.
Basically subscribes to a topic, mind you. Here as well, I want
to point out that in the publish function we are publishing to this
particular topic, conf 42 Go. And in
the subscribe function I'm subscribing to Conf 42 Poundkey
and this is a wildcard. You can read more about MQTT wildcards.
So now that I have the publish and subscribe methods
already done, let's go ahead in our main loop and
what we're going to do is we're going to start the main loop by subscribing
to the topic of choice, and then we start the publishing.
After we publish ten messages in a loop, we go ahead
and disconnect the client. So let's go ahead
and run this, go back to my terminal, I'm going
to do go run main so
what happened? Right here it says we're connected to the message broker and
we subscribe to this topic. Now the publisher behind the scene
is publishing ten messages from zero to nine,
and the subscriber receives messages on the topic of
choice. Cool. Now that we had this demo,
Sal is still wondering. Great. Now I know how to use go with
messaging protocols. I'm still not sure how I can achieve
a protocol and language agnostic approach.
That's when you use abstraction frameworks or even
an advanced message broker. So let's
delve into details about what an event driven architecture
framework is in go. These are pretty much
go libraries that abstract the underlying implementation of an event
driven technology via APIs. Let's take a look at an example. So basically we would
have an interface that abstracts all
the different integrations of different messaging APIs.
An example to this framework is Watermill,
and Watermill IO has several
integrations that abstracts the implementation
of the messaging system, the pub messaging system.
At its core,
Watermill has two interfaces.
You have a publish interface and a subscribe interface. And you can see here that
the different integrations,
they follow the two interfaces, whether the publish or
the subscribe interface. Keep in mind that things
library only allows protocols communication
on the supported integrations and it's isolated for go applications.
So you would have a publisher
that publishes messages and a subscriber that listens for incoming messages and
reacts to them. So pretty much you got a
publisher. Regardless what this publisher is, it's abstracted.
It will publish messages on a predefined topic and the subscriber
subscribes to the predefined topic,
as you know, further abstraction
on the implementation of the understanding pub messaging API you've got. For example,
let's say you want to have an AMQP publisher. All you got to
do is define a new AMQP publisher and then
publish messages using the publish
and subscribe interface. So it's basic at its implementation you
have a publish and subscribe interface.
So sometimes you want to think about
how can I achieve protocol and multilanguage EDA microservices?
And this is where we would have to look into
advanced message brokers that support multiple languages
and protocols. When you use a library or
a tool that has a basic publish and
subscribe interfaces or operations, you could
achieve what you want. You could achieve an event driven architecture.
But then if you want to expand this further to other
things that you want to use, think about security,
think about role based access control, think about governance of your
EDA architecture. Think about, as you can see here, multi protocol and
a multi language EDA microservices. Let's say that you even
have some legacy infrastructure and legacy tools and you want them to interact with
your Go microservices. I'll quickly cover
what Solace Pubsub plus Eventdriven is all
about. One of the advantages or benefits of
the Solace Pubsub plus Eventdriven is the protocol interoperability
and the protocol translation. So you can see here, I've highlighted
in the diagram below that one
of the solace native APIs, languages, Go is
one of them. So you can communicate with the solace broker using Go,
the pubsublus messaging API for Go and publish
or subscribe to messages on the broker.
There's other microservices and languages
that are involved. Let's say, for example, that you have another web
browser, microservice, that is publishing messages using
an open standard protocol like MQTT using JavaScript.
So with the benefits of using an advanced
message broker in the middle of your
architecture, in your infrastructure, you leverage
the interoperability feature and the protocol
translation feature of this brokerage. So let's
have a wants on demo using the Solace hub subplus messaging
API for go and we will come back to this.
Now back to our conf 42 demo directory. I'm going to install
the solace go API through Gogetsollas Devgo
messaging. Once I execute this command, it will download the
solace go API. I will not run it because I ran it previously.
So let's go ahead and open up this directory.
I'm going to create a new file over here and call it,
I will call it Solacepublisher.
Go. Let me make this bigger and
increase the size over here. So this
is package main and I will
go ahead and start my main
program. So what I'm going to do at first I'm going to define my configuration
parameters to connect to the broker. So our
host is tcpublic
messaging solace cloud.
There's a typo VPN name is
public, username is Conf fourty
two and the password is public.
Then what I'm going to do is create a messaging service
and start that messaging service. Note that the
Solisco API is built
on a builder
pattern. So right now what I'm going to do is that
created a messaging service and started the
messaging service from the messaging service.
I want to build a direct message builder
because right now what we wants to do is have a publisher that publishes
messages to a solace broker using the
solace native API. So what I'm going
to do over here is I have a direct publisher.
I'm going to create a direct message publisher from the messaging service and start
that messaging publisher. And now let's
go ahead and create the message that we
want to be sending. So I will be
creating the message right now. So what
we have over here is I'm going to create a message
sequence number so I can dynamically have or build
the payload of the body. The message body
will be let's say hello from Conf
42 and I'm creating a message
through a message builder. I'm creating a message builder basically from the messaging
service and adding different properties to the message. Right now what
I wants to do is I want to have an infinite
program that publishes messages every second.
So this is what I will be doing.
Let me put a new line here to make it look better. So I'm
going to run forever until can interrupt signal is received.
What I'll be doing is I have my message sequence number variable.
Incrementing it, I'm going to be creating a message
that has the payload of the message is the message body hello from conf fourty
two and I'm just going to add concatenate to it the message sequence
number to have dynamic message body. And then I'm
golang to create a topic. So I will be sending
a message on the following topic, the Conf 42
solace go and also concatenating elements to
the topics to show how we can create dynamic
topics in here. All right, and then
what I will be doing is publishing the message on the predefined
topic and then sleeping for a second. And that's about
it. We're going to be doing this going in an
infinite loop over here until
an interrupt is received. What I will do is I'm going
to handle the interrupt using Go channels.
This is one way to handle interrupts.
So what I did is I created a channel
that listens to an operating system
signal interrupt. So I
will block the program until an interrupt is received.
And once we're done with the program,
for good practice, what I'll be doing is
terminating the messaging service
and quitting the publisher. So that's about it.
So what this program will do is connect
to the messaging service on the predefined host
and from here publishes messages. So what I'm trying
to do is if you recall this diagram, we have the
go application using the solace native API. We'll be connecting
to the solace broker and publishing messages every second. It'll be
cool to connect to the broker using any
other API. So let's say I'm going to use an open
protocol MQTT Javascript MQTT application
and connect to the broker that
way. So I have prepared a
public MQTT broker provided by Hive MQ.
So this MQTT broker connects to any
MQTT broker using MQTT Javascript.
So our host is public messaging
messaging solace cloud on port 8000,
username is Conf 42, password is
public, I will connect to it. There you go.
I am connected to the broker and
the subscription that I want to add is Conf
42 greater than. So this means I want to
subscribe to any topic that comes to any
message that comes to this topic. So let's go ahead to our program over
here, open my terminal again and I'm going to run the
solace publisher, the application that was just created.
So what I'm doing right here is I'm publishing messages on this topic to the
solace broker. So it's coming from the microservice
that we have written in the Go native solace
API into the solace broker. And then I have here
another application, another client
that is connected to the solace broker using an
MQTT open protocol and
subscribing to the topic of choice. So this showcase a
multilingual, multi protocol,
event driven architecture where we
have one language using Go
and connect it to solace using a solace
message protocol. And then we have another protocol
and another microservice which is this client the web browser
connected to the same broker, using a different protocol
and a different programming language, JavaScript, and still
receiving the same messages that were sent by
the original application.
Keep in mind that the solid pub supplies messaging API for Go is available
for download on April 1 and I promise this is not
an API fool's joke.
So final remarks I want to
cover just before we end it.
This was kind of a very quick, light hearted talk
and presentation to talk about what event
driven architectures are about how Go can fit
in an event driven architecture system.
A couple of know when we think about event
driven at an enterprise, I want to encourage you to
step back and take a look at EdA in general. Whether you're using Go or
any other programming languages, there are a lot of things that are involved and a
lot of moving parts are involved. When it comes to dealing
with event driven architectures, you have complex environments,
whether it's hybrid, cloud, multicloud or multiple geographical
locations. You got diverse set of technologies. So you have
the microservices, IoT devices, cloud native services,
you got legacy technologies, infrastructure platform
as surface ipasses and you want to communicate with these. You even have
like enterprise demands. Do you have the performance,
scalability, security? There are other capabilities that
are required. So when you think about event driven architectures
and can event driven system, you have to
take into account the design of that system, the documentation,
the discovery, the governance, the access control on
that system. So event driven architecture is not just about pub
sub, it's not just about how you publish messages and subscribe to
messaging. There are other factors that take into account to deploy an
event driven architecture in an enterprise and production
ready level. So you
can use go in different programming and different programming
languages in this and I showcased how this is done.
So all that to say, I wanted
to mention that it's a lot to think about. It can
feel daunting at first, but it's all necessary
to do this well at skills.
So this is something that I wanted to keep in mind.
What next? Before we head out and call
it a day for this presentation, a couple of things I want to point out.
We have a live coding event on API twelveth. So mark your calendars. It will
be live streamed on YouTube and LinkedIn and I'll
probably also be live streaming it on Twitter. I'll be
using the solace type supplies messaging API on
a live coding session. So getting a lot of feedback and questions from
the audience is great. Solace community join the solace community.
We have an Easter egg hunt event that is starting very
soon, so stay tuned. There's a lot of prizes, a lot
of giveaways for this. Follow us on Twitter at
solace devs and at tweet to mimi.
And finally, if you're interested in
event driven architectures, there's an EDA summit coming up on May 4
at edasummit.com. So you can take a
look at that, check it out and see if you have any other
questions there. So that is pretty much it,
folks. Thanks again for tuning in.
I am more, more than happy to take any
questions. If anybody has any questions, feel free to ask
on the Discord channel. Or if you're watching this
recording after the conference, feel free
to reach out to me on Twitter at tweet to
Tamimi or at solace devs, and I will make sure
to answer your questions. Thank you. Take care.