The Zen of High Performance Messaging with NATS
Waldemar Quevedo Salinas, Senior Software Engineer
NATS is an open source, high performant messaging system with a design oriented towards both being as simple and reliable as possible without at the same time trading off scalability. Originally written in Ruby, and then rewritten in Go, a NATS server can nowadays push over 11M messages per second.
In this talk, we will cover how following simplicity as the main design constraint as well as focusing on a limited built-in feature set, resulted in a system which is easy to operate and reason about, making up for an attractive choice for when building many types of distributed systems where low latency and high availability are very important.
You can learn more about NATS at http://www.nats.io
NATS: Simple, Secure and Scalable Messaging For the Cloud Native Erawallyqs
The majority of middleware and messaging systems in use were built in a time that did not have the concept of scale and real-time data that developers operate in today.
With the rise of Cloud Native and Microservices architectures as a design principle and the emphasis on simplicity, speed, and flexibility that come with it, developers need a messaging protocol to match.
Enter NATS. NATS is a remarkably lightweight messaging protocol, and extremely flexible and resilient. It is just a few MB in size, and can scale to publish tens of millions of message from a single server.
Jaime Piña, @variadico, Software Engineer at Apcera
Microservice issues are networking issues. Fixing code in your app is easy, but the hard part of using microservices is the networking. How do you actually know if you're sending what you think you are? Why does this request fail in my app, but not when I use curl? Is this service very slow or is it up at all?
This talk will help demystify some common problems you might experience while building out your collection of microservices. Once you can find the issue, it becomes way easier to fix.
The Zen of High Performance Messaging with NATS (Strange Loop 2016)wallyqs
Video: https://www.youtube.com/watch?v=dYrYCt2dTkw
HTML5: https://wallyqs.github.io/stl-nats-talk/
NATS is an open source, high performant messaging system with a design oriented towards both being as simple and reliable as possible without at the same time trading off scalability. Originally written in Ruby, and then rewritten in Go, a NATS server can nowadays push over 11M messages per second.
In this talk, we will cover how following simplicity as the main design constraint as well as focusing on a limited built-in feature set, resulted in a system which is easy to operate and reason about, making up for an attractive choice for when building many types of distributed systems where low latency and high availability are very important.
SF Python Meetup - Introduction to NATS Messaging with Python3wallyqs
NATS (https://nats.io) is a simple, secure and performant communications system for all digital systems, services and devices. This talk will give an overview about the project along with examples of how to use its asyncio client (https://github.com/nats-io/nats.py) to build applications using NATS streams and services.
Micro on NATS - Microservices with MessagingApcera
This is a talk given by Asim Aslam at the NATS London Meetup on May 10th, 2016. It explains what Micro is (Microservices toolkit), and how it uses NATS - a lightweight high performance open source messaging system for microservices, cloud native, and IoT networks written in Golang.
You can learn more about NATS at http://www.nats.io
You can learn more about Micro at https://micro.mu/
Simple Solutions for Complex Problems - Boulder MeetupApcera
At the NATS June Meetup in Boulder, CO, Tyler Treat of Workiva gives and updated talk on how to embrace simplicity to solve complex infrastructure problems, and how shares more information on how Workiva uses NATS for microservices communication.
You can learn more about NATS at http://www.nats.io
NATS: Simple, Secure and Scalable Messaging For the Cloud Native Erawallyqs
The majority of middleware and messaging systems in use were built in a time that did not have the concept of scale and real-time data that developers operate in today.
With the rise of Cloud Native and Microservices architectures as a design principle and the emphasis on simplicity, speed, and flexibility that come with it, developers need a messaging protocol to match.
Enter NATS. NATS is a remarkably lightweight messaging protocol, and extremely flexible and resilient. It is just a few MB in size, and can scale to publish tens of millions of message from a single server.
Jaime Piña, @variadico, Software Engineer at Apcera
Microservice issues are networking issues. Fixing code in your app is easy, but the hard part of using microservices is the networking. How do you actually know if you're sending what you think you are? Why does this request fail in my app, but not when I use curl? Is this service very slow or is it up at all?
This talk will help demystify some common problems you might experience while building out your collection of microservices. Once you can find the issue, it becomes way easier to fix.
The Zen of High Performance Messaging with NATS (Strange Loop 2016)wallyqs
Video: https://www.youtube.com/watch?v=dYrYCt2dTkw
HTML5: https://wallyqs.github.io/stl-nats-talk/
NATS is an open source, high performant messaging system with a design oriented towards both being as simple and reliable as possible without at the same time trading off scalability. Originally written in Ruby, and then rewritten in Go, a NATS server can nowadays push over 11M messages per second.
In this talk, we will cover how following simplicity as the main design constraint as well as focusing on a limited built-in feature set, resulted in a system which is easy to operate and reason about, making up for an attractive choice for when building many types of distributed systems where low latency and high availability are very important.
SF Python Meetup - Introduction to NATS Messaging with Python3wallyqs
NATS (https://nats.io) is a simple, secure and performant communications system for all digital systems, services and devices. This talk will give an overview about the project along with examples of how to use its asyncio client (https://github.com/nats-io/nats.py) to build applications using NATS streams and services.
Micro on NATS - Microservices with MessagingApcera
This is a talk given by Asim Aslam at the NATS London Meetup on May 10th, 2016. It explains what Micro is (Microservices toolkit), and how it uses NATS - a lightweight high performance open source messaging system for microservices, cloud native, and IoT networks written in Golang.
You can learn more about NATS at http://www.nats.io
You can learn more about Micro at https://micro.mu/
Simple Solutions for Complex Problems - Boulder MeetupApcera
At the NATS June Meetup in Boulder, CO, Tyler Treat of Workiva gives and updated talk on how to embrace simplicity to solve complex infrastructure problems, and how shares more information on how Workiva uses NATS for microservices communication.
You can learn more about NATS at http://www.nats.io
NATS is a high performance messaging server and also one of the latest additions to the CNCF. In this talk, we will make a deep dive to the internals of the project covering its design, protocol, clustering implementation, security and authorization features that make it an attractive solution for microservices and low latency applications.
NATS is a high performance messaging system that was originally created as part of CloudFoundry but since then it has grown its own ecosystem and community around it, and also recently included as part of the Cloud Native Computing Foundation (CNCF).
Similar to Ruby, one of the goals from NATS is to make building messaging based applications as simple and reliable as possible. In this talk, we will cover why NATS might be interesting to consider for your next project and share some of the lessons learned so far from maintaining the Ruby clients from NATS.
An in depth overview of the possibilities of SNMP. How to monitor your environment using SNMP.
Learn what you can do with SNMP and what SNMP can do for you within one hour. Most aspects of SNMP are addressed. Getting the information, setting values, but also how the information is presented and the difference between the OID and the MIBs.
In this presentation I’m trying to make SNMP “simple” again and understandable for everybody.
GopherCon 2017 - Writing Networking Clients in Go: The Design & Implementati...wallyqs
The NATS Go client is the canonical implementation of a client for the NATS Messaging System, and from the beginning it was designed for high performance. In this talk, we will cover its APIs and dissect how the client internal engine works to get the most out of Go to achieve maximum throughput.
Connect Everything with NATS - Cloud Expo Europewallyqs
NATS is a high performance publish/subscribe messaging system that has as one of its main goals connecting services in the simplest, most secure and reliable way possible.
The project has a long history of being part of production deployments as the core component for the internal communication of a distributed system, and in its latest release NATS v2.0, its feature set was enhanced so that it can also be used to create a global and decentralized communication network.
KubeCon NA 2018 - NATS Deep Dive: The Evolution of NATSwallyqs
The NATS project and its ecosystem have been continuously evolving since joining the CNCF and in this session we will share a retrospective of what is the current state of the art and overall direction of the project in terms of security, performance, reliability, and integration with other cloud native tools such as Kubernetes. If are you actively evaluating NATS and want to learn the latest best practices, are writing clients for it, production user or interested in becoming a contributor, then you should definitely attend. For those new to NATS, we suggest also attending the NATS introduction session.
OSCON: Building Cloud Native Apps with NATSwallyqs
NATS is a mature, high-performance publish/subscribe messaging system that is a hosted project of the Cloud Native Computing Foundation (CNCF). NATS has a goal of connecting services in the simplest, most secure and reliable way possible, and cloud native applications built using NATS inherit much of that simplicity and become easier to operate, benefiting from the performance and resiliency characteristics from the server.
Waldemar Quevedo walks you through how to build an application using NATS and how to set up, deploy, and operate a NATS cluster on top of Kubernetes. You’ll learn core NATS features like publish/subscribe, load-balanced queue subscribers, request/response, and handing connection events and examine NATS cluster setup and client application failover, graceful NATS server shutdown and NATS server configuration reload, and graceful client shutdown with NATS Drain mode. You’ll also learn how to secure a NATS cluster with Transport Layer Security (TLS) and secure streams and services with permissions, account isolation and NATS keys (NKEYS) (ed25519 based), and decentralized permissions via JSON Web Tokens (JWTs).
GoSF: Decoupling Services from IP networks with NATSwallyqs
In this talk, we’ll demonstrate how to radically simplify your deployment with NATS, through location transparency, using multiple communication patterns, isolated communication contexts, distributed security, and zero configuration application failover. You’ll learn core NATS features like publish/subscribe, load-balanced queue subscribers, request/response, as well as some of its more recent security features such as securing streams and services with permissions, account isolation and NATS keys (NKEYS, ed25519 based), and decentralized auth via JSON Web Tokens (JWTs) by showing the internals of a decentralized Slack-like demo application.
There is a renaissance underway in the messaging space. Due to the demands of IoT networks, cloud native apps, and microservices developers are looking for simple, fast, messaging systems. This is a sharp contrast to how traditional messaging was done.
This webinar will cover:
- The basics of messaging patterns
- What makes NATS unique
- Using a demo inspired by Pokemon Go as an example
Simple and Scalable Microservices: Using NATS with Docker Compose and SwarmApcera
Waldemar Quevedo, Senior Software Engineer at Apcera
NATS is a high-performance messaging system optimized for simplicity, reliability and low latency which can be a lightweight solution for the internal communication of your distributed system. In this talk, we will cover its core feature set as well as how to develop and assemble NATS-based microservices using the latest Docker tooling such as Compose and Swarm mode.
You can learn more about NATS at http://www.nats.io
NATS - A new nervous system for distributed cloud platformsDerek Collison
NATS is an open-source, high-performance, lightweight cloud messaging system.
NATS was created by Derek Collison, Founder/CEO of Apcera who has spent 20+ years designing, building, and using publish-subscribe messaging systems. Unlike traditional enterprise messaging systems, NATS has an always-on dial tone that does whatever it takes to remain available. This forms a great base for building modern, reliable, and scalable cloud and distributed systems.
NATS & Docker Meetup in Toronto - August 2016
Implementing Microservices with NATS, Diogo Monteiro
-How Aytra uses NATS
-Benefits of using NATS for inter service communication
-Lessons learned adopting NATS
-Overview of Houston NATS library
-Demo of Aytra
You can learn more about NATS at http://www.nats.io
Presentation from a talk given by Diogo Monteiro (@diogogmt) at a recent NATS Meetup in Toronto. The talk covered why NATS is a simple, fast method for microservices communication, and provides some latency benchmarks from Diogo's design of a solution using NATS.
You can learn more about NATS at http://www.nats.io
How Greta uses NATS to revolutionize data distribution on the InternetApcera
Dennis Mårtensson is the CTO and co-founder of Greta, a Swedish startup that wants to change the way content is delivered on the internet. Greta has developed a technology for peer-to-peer content delivery over webRTC and are using NATS to create rapid webRTC signaling.
You can learn more about NATS at http://www.nats.io. You can learn more about Greta at https://greta.io/
Tyler Treat
Workiva
NATS Meetup 3/22/16
• Embracing the reality of complex systems
• Using simplicity to your advantage
• Why NATS?
• How Workiva uses NATS
You can learn more about NATS at http://www.nats.io
NATS is a high performance messaging server and also one of the latest additions to the CNCF. In this talk, we will make a deep dive to the internals of the project covering its design, protocol, clustering implementation, security and authorization features that make it an attractive solution for microservices and low latency applications.
NATS is a high performance messaging system that was originally created as part of CloudFoundry but since then it has grown its own ecosystem and community around it, and also recently included as part of the Cloud Native Computing Foundation (CNCF).
Similar to Ruby, one of the goals from NATS is to make building messaging based applications as simple and reliable as possible. In this talk, we will cover why NATS might be interesting to consider for your next project and share some of the lessons learned so far from maintaining the Ruby clients from NATS.
An in depth overview of the possibilities of SNMP. How to monitor your environment using SNMP.
Learn what you can do with SNMP and what SNMP can do for you within one hour. Most aspects of SNMP are addressed. Getting the information, setting values, but also how the information is presented and the difference between the OID and the MIBs.
In this presentation I’m trying to make SNMP “simple” again and understandable for everybody.
GopherCon 2017 - Writing Networking Clients in Go: The Design & Implementati...wallyqs
The NATS Go client is the canonical implementation of a client for the NATS Messaging System, and from the beginning it was designed for high performance. In this talk, we will cover its APIs and dissect how the client internal engine works to get the most out of Go to achieve maximum throughput.
Connect Everything with NATS - Cloud Expo Europewallyqs
NATS is a high performance publish/subscribe messaging system that has as one of its main goals connecting services in the simplest, most secure and reliable way possible.
The project has a long history of being part of production deployments as the core component for the internal communication of a distributed system, and in its latest release NATS v2.0, its feature set was enhanced so that it can also be used to create a global and decentralized communication network.
KubeCon NA 2018 - NATS Deep Dive: The Evolution of NATSwallyqs
The NATS project and its ecosystem have been continuously evolving since joining the CNCF and in this session we will share a retrospective of what is the current state of the art and overall direction of the project in terms of security, performance, reliability, and integration with other cloud native tools such as Kubernetes. If are you actively evaluating NATS and want to learn the latest best practices, are writing clients for it, production user or interested in becoming a contributor, then you should definitely attend. For those new to NATS, we suggest also attending the NATS introduction session.
OSCON: Building Cloud Native Apps with NATSwallyqs
NATS is a mature, high-performance publish/subscribe messaging system that is a hosted project of the Cloud Native Computing Foundation (CNCF). NATS has a goal of connecting services in the simplest, most secure and reliable way possible, and cloud native applications built using NATS inherit much of that simplicity and become easier to operate, benefiting from the performance and resiliency characteristics from the server.
Waldemar Quevedo walks you through how to build an application using NATS and how to set up, deploy, and operate a NATS cluster on top of Kubernetes. You’ll learn core NATS features like publish/subscribe, load-balanced queue subscribers, request/response, and handing connection events and examine NATS cluster setup and client application failover, graceful NATS server shutdown and NATS server configuration reload, and graceful client shutdown with NATS Drain mode. You’ll also learn how to secure a NATS cluster with Transport Layer Security (TLS) and secure streams and services with permissions, account isolation and NATS keys (NKEYS) (ed25519 based), and decentralized permissions via JSON Web Tokens (JWTs).
GoSF: Decoupling Services from IP networks with NATSwallyqs
In this talk, we’ll demonstrate how to radically simplify your deployment with NATS, through location transparency, using multiple communication patterns, isolated communication contexts, distributed security, and zero configuration application failover. You’ll learn core NATS features like publish/subscribe, load-balanced queue subscribers, request/response, as well as some of its more recent security features such as securing streams and services with permissions, account isolation and NATS keys (NKEYS, ed25519 based), and decentralized auth via JSON Web Tokens (JWTs) by showing the internals of a decentralized Slack-like demo application.
There is a renaissance underway in the messaging space. Due to the demands of IoT networks, cloud native apps, and microservices developers are looking for simple, fast, messaging systems. This is a sharp contrast to how traditional messaging was done.
This webinar will cover:
- The basics of messaging patterns
- What makes NATS unique
- Using a demo inspired by Pokemon Go as an example
Simple and Scalable Microservices: Using NATS with Docker Compose and SwarmApcera
Waldemar Quevedo, Senior Software Engineer at Apcera
NATS is a high-performance messaging system optimized for simplicity, reliability and low latency which can be a lightweight solution for the internal communication of your distributed system. In this talk, we will cover its core feature set as well as how to develop and assemble NATS-based microservices using the latest Docker tooling such as Compose and Swarm mode.
You can learn more about NATS at http://www.nats.io
NATS - A new nervous system for distributed cloud platformsDerek Collison
NATS is an open-source, high-performance, lightweight cloud messaging system.
NATS was created by Derek Collison, Founder/CEO of Apcera who has spent 20+ years designing, building, and using publish-subscribe messaging systems. Unlike traditional enterprise messaging systems, NATS has an always-on dial tone that does whatever it takes to remain available. This forms a great base for building modern, reliable, and scalable cloud and distributed systems.
NATS & Docker Meetup in Toronto - August 2016
Implementing Microservices with NATS, Diogo Monteiro
-How Aytra uses NATS
-Benefits of using NATS for inter service communication
-Lessons learned adopting NATS
-Overview of Houston NATS library
-Demo of Aytra
You can learn more about NATS at http://www.nats.io
Presentation from a talk given by Diogo Monteiro (@diogogmt) at a recent NATS Meetup in Toronto. The talk covered why NATS is a simple, fast method for microservices communication, and provides some latency benchmarks from Diogo's design of a solution using NATS.
You can learn more about NATS at http://www.nats.io
How Greta uses NATS to revolutionize data distribution on the InternetApcera
Dennis Mårtensson is the CTO and co-founder of Greta, a Swedish startup that wants to change the way content is delivered on the internet. Greta has developed a technology for peer-to-peer content delivery over webRTC and are using NATS to create rapid webRTC signaling.
You can learn more about NATS at http://www.nats.io. You can learn more about Greta at https://greta.io/
Tyler Treat
Workiva
NATS Meetup 3/22/16
• Embracing the reality of complex systems
• Using simplicity to your advantage
• Why NATS?
• How Workiva uses NATS
You can learn more about NATS at http://www.nats.io
Patterns for Asynchronous Microservices with NATSApcera
Presentation from a talk by Raul Perez (@repejota) of R3Labs on asynchronous microservices patterns using NATS (@nats_io), the lightweight, high performance open source messaging system written in Go.
You can learn more about NATS at http://www.nats.io
NATS: A Central Nervous System for IoT Messaging - Larry McQuearyApcera
Security, identity and scalability define the IoT landscape. Developers in any IoT ecosystem need a flexible, lightweight and secure method to communicate device status/telemetry and content that operates at the speed of a central nervous system and doesn’t rely on inflexible and outdated protocol specifications designed for point-to-point communication. Enter NATS.
NATS is an open source messaging framework based on Go that is designed for simple, secure, lightweight and scalable messaging in any language and for any platform/processor architecture.
Larry McQueary present's an overview and short demonstration on the NATS architecture and API that will demonstrate how NATS can enable “things” and backend infrastructure to communicate securely and scalably at high speed without locking in vendor-specific technology or protocols.
You can learn more about NATS at http://www.nats.io
IT Modernization Doesn’t Mean You Leave Your Legacy Apps BehindApcera
As enterprises adopt cloud infrastructure and modern architectures, they can’t turn their back on existing applications. The challenge is that legacy applications are expensive-to-maintain and inflexible due to infrastructure requirements and dependencies.
Explore new approaches to application modernization with Mark Thiele, Chief Strategy Officer at Apcera, and Ralph Loura, CTO and Rodan + Fields, to learn how to protect current IT investments and establish a secure path to the cloud.
Cassandra Day NY 2014: Message Architectures in Distributed Systems at Simple...DataStax Academy
Eric will be presenting on SimpleReach's use of message architectures and why they an important part of a distributed system stack. They are often overlooked because the prevailing sentiment is that the storage and processing engines are the most important aspects of the system. Without the highways, the data won’t be able to get to its destination.
On making standards organizations & open source communities work hand in handBenjamin Cabé
Did you know that the Eclipse Foundation is home to many open source implementations of standards from a dozen of standards defining organizations: IETF, ISO, oneM2M, OASIS, etc.
We do believe that open source is key to standards' adoption, and this presentation shares some thoughts on what makes a standard successful, and how Eclipse has proved with recent success stories that open source and open communities are a key factor.
Messaging Brokers are intrinsic part of our infrastructure and our experience with HornetQ has not been really great.
We have experienced issues that forced us to perform restarts multiple times a day and sometimes they weren't sufficient to fix the issue and data cleanup was needed resulting in loss of important messages.
Lack of documentation, lack of proper support and lack of stability of HornetQ broker are some of the reasons for looking into new Messaging Brokers.
During this session I will present the path we have taken to Prioritize Features -> Compare Brokers -> Eliminate -> Benchmark and the findings together with recommendations.
This task resulted in implementation of generic messaging broker benchmarking tool in Java, called Benchmark.io which we are intending to open source.
Cloudbakers' Presentation at Jobg8's Job Board Summit 2013cloudbakers
The Consumerization of IT has allowed people to work the way they live. Take a look at the trends in cloud computing to see if your company can benefit from all that the cloud has to offer!
Simple and Scalable Microservices: Using NATS with Docker Compose and Swarm NATS
NATS is a high-performance messaging system optimized for simplicity, reliability and low latency which can be a lightweight solution for the internal communication of your distributed system. In this talk, we will cover its core feature set as well as how to develop and assemble NATS-based microservices using the latest Docker tooling such as Compose and Swarm mode.
You can learn more about NATS at http://www.nats.io
Microservices Meetup San Francisco - August 2017 Talk on NATSNATS
Waldemar Quevedo on the NATS team covers why NATS is a great fit as a microservices control plane, and how to build simple, resilient, highly scalable microservices using NATS with the flexible integration patterns it provides.
This the talk I gave at Docker Docker Docker Austin Cloud Users meetup in Austin on January 21st, 2014. The talk was about the use of Docker at Flux7 Labs (flux7.com). I chose to deep dive into one of the most interesting Internet of Things use cases: Implement multi-tenancy on Solar Panel Monitoring Solution using Docker.
Of the variedtypes of IPC, sockets arout and awaythe foremostcommon..pdfanuradhasilks
Of the variedtypes of IPC, sockets arout and awaythe foremostcommon. On any given platform,
there arprobably to be differenttypes of IPC that arquicker, except for cross-platform
communication, sockets arregardingthe sole game in city.
They were fancied in Berkeley as a part of the BSD flavor of UNIX operating system. They
unfold like inferno withthe web. With sensible reason — the mixture of sockets with INET
makes reprehensionabsolute machines round the world incrediblystraightforward (at least
compared to different schemes).
Creating a Socket
Roughly speaking, once you clicked on the link that brought you to the current page, your
browser did one thingjust like the following:
#create Associate in Nursing INET, STREAMing socket
s = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
#now connect withthe net server on port eighty
# - the traditionalcommunications protocol port
s.connect((\"www.mcmillan-inc.com\", 80))
When the connect completes, the socket s may beaccustomedsend outa call for participation for
the text of the page. a similar socket canbrowse the reply, so be destroyed. That’s right,
destroyed. shopper sockets arunremarkablysolely used for one exchange (or atiny low set of
sequent exchanges).
What happens within thenet server may be a bit additionalcomplicated. First, the net server
creates a “server socket”:
#create Associate in Nursing INET, STREAMing socket
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
#bind the socket to a public host,
# and a widely known port
serversocket.bind((socket.gethostname(), 80))
#become a server socket
serversocket.listen(5)
A couple things to notice: we tend to used socket.gethostname() in order that the socket would
be visible to the surface world. If we tend to had used s.bind((\'localhost\', 80)) or
s.bind((\'127.0.0.1\', 80)) we\'d still have a “server” socket, however one that was solely visible
insidea similar machine. s.bind((\'\', 80)) specifies that the socket isaccessible by any address the
machine happens to own.
A second issue to note: low range ports arsometimes reserved for “well known” services (HTTP,
SNMP etc). If you’re kidding, use a pleasant high range (4 digits).
Finally, the argument to pay attention tells the socket library that we wish it to queue as several
as five connect requests (the traditional max) before refusing outside connections. If the
remainder of the code is written properly,that ought to be masses.
Now that we\'ve got a “server” socket, listening on port eighty, we will enter the mainloop of the
net server:
while 1:
#accept connections from outside
(clientsocket, address) = serversocket.accept()
#now do one thing with the clientsocket
#in this case, we\'ll fakethis can be a rib server
ct = client_thread(clientsocket)
ct.run()
There’s trulythree general ways thatduring which this loop might work - dispatching a thread to
handle clientsocket, producea replacementmethod to handle clientsocket, or structure this app to
use non-blocking socke.
Bare Metal to OpenStack with Razor and ChefMatt Ray
Slides from the OpenStack Spring 2013 Summit workshop presented by Egle Sigler (@eglute) and Matt Ray (@mattray) from Rackspace and Opscode respectively. Please refer to http://anystacker.com/ for additional content.
Writing Networking Clients in Go - GopherCon 2017 talkNATS
Talk by Wally Quevedo at GopherCon 2017 on writing networking clients in Go, based on our experience with Go on the NATS team. The full talk is available on YouTube: https://www.youtube.com/watch?v=QoetRI2KHvc
Presentation of a few mechanisms that can help to automate the bootstrap process in IoT environment.
This is the summary of my work done during an 8 weeks internship at red hat
How to build a Kubernetes networking solution from scratchAll Things Open
Presented by: Antonin Bas & Jianjun Shen, VMware
Presented at All Things Open 2020
Abstract: For the non-initiated, Kubernetes (K8s) networking can be a bit like dark magic. Many clusters have requirements beyond what the default network plugin, kubenet, can provide and require the use of a third-party Container Network Interface (CNI) plugin. But what exactly is the role of these plugins, how do they differ from each other and how does the choice of one affect your cluster?
In this talk, Antonin and Jianjun will describe how a group of developers was able to build a CNI plugin - an open source project called Antrea - from scratch and bring it to production in a matter of months. This velocity was achieved by leveraging existing open-source technologies extensively: Open vSwitch, a well-established programmable virtual switch for the data plane, and the K8s libraries for the control plane. Antonin and Jianjun will explain the responsibilities of a CNI plugin in the context of K8s and will walk the audience through the steps required to create one. They will show how Antrea integrates with the rest of the cloud-native ecosystem (e.g. dashboards such as Octant and Prometheus) to provide insight into the network and ensure that K8s networking is not just dark magic anymore.
Docker 1.9 introduced a new networking architecture that uses VXLAN overlays to connect distinct Docker hosts. I will go over the new architecture, its advantages, and use-cases, and demo how it can enable scaling applications with Compose and Swarm.
Similar to The Zen of High Performance Messaging with NATS (20)
The Context package has been a popular topic in the Golang community for sometime and as of the Go 1.7 release, it has become a standard Go library. It carries a variety of details across API boundaries and between processes.
NATS is an open-source, high-performance, lightweight cloud native messaging system. Many NATS users working in Go have been using Context alongside NATS, but there has not been an officially-supported Context-NATS integration – that is, until now.
This talk will discuss what Context is, what observations and lessons Waldemar and his team have learned integrating Context and NATS, and how you use the two together. He'll also provide a quick demo to show the integration.
About the Speaker:
Waldemar Quevedo is a Senior Software Engineer at Apcera, where he develops the Apcera Trusted Platform and is part of the NATS team. Previously, he formed part of the PaaS team at Rakuten in Tokyo which was one of the early adopters of CloudFoundry for production usage where he experienced operating NATS for the first time, and became a fan of its simplicity.
You can learn more about NATS at http://www.nats.io
How Clarifai uses NATS and Kubernetes for Machine LearningApcera
Clarifai (www.clarifai.com) is a machine learning company which aims to make artificial intelligence accessible to the entire world.
Their platform allows users to tap into powerful machine learning algorithms while abstracting away the technical minutiae of how the algorithms work and the infrastructure scaling problems of building AI applications from scratch.
Clarifai has moved to a highly available Kubernetes (www.kubernetes.io) based architecture, which also required a simple, scalable messaging layer.
NATS (www.nats.io) was selected by the Clarifai team for a variety of reasons.
The video of the talk that accompanies these slides is available at:
https://www.youtube.com/watch?v=fJ20plWSBzw&feature=youtu.be
The simple goal of this presentation is to help IT staff make more informed decisions about the how and why of modernizing ITs ability to deliver services.
Presentation by Mark Thiele, Chief Strategy Officer, Apcera
https://www.apcera.com/
At the NATS June Meetup in Boulder, CO, Steven Osborne and Charlie Strawn of Workiva present the Actor Model concept their team are using, and some of the work they are doing to connect NATS and Akka.
You can learn more about NATS at http://www.nats.io
At the NATS June Meetup in Boulder, CO, Colin Sullivan (Principal Engineer on the NATS team) gives an overview of NATS, the NATS Connector Framework, and how to get started building connectors for NATS.
You can learn more about NATS at http://www.nats.io
How to Migrate to Cloud with Complete Confidence and TrustApcera
Henry Stapp, Director of Product Management at Apcera, explores the promises of the cloud and how new technologies (containers, micro-services, etc.) enable unparalleled speed and flexibility.
KURMA - A Containerized Container Platform - KubeCon 2016Apcera
Kurma is a container runtime that is based on the container instrumentation built into the Apcera Platform. Kurma, and its accompanied “KurmaOS” is our vision of a lightweight, fully containerized operating system.
This presentation will cover Apcera’s journey in its container
instrumentation. Beginning with the pre-Docker landscape, how it grew over the course of 3+ years, and the “next-gen” adaption of it, where the base container instrumentation has been adapted to stand on its own, and growing it to be used beyond just Apcera’s own usage.
Kurma incorporates a lot of lessons learned with both development and operations of a container platform, including building modular vs monolith, extensibility being built in vs built on, and managing a cluster of hosts and containers.
We’ll also cover our experiences with introducing it to Kubernetes as another first class runtime provider. Taking how Kurma works and have it work with Kubernetes, and how we’d like to see Kubernetes grow in some of the areas we see Kurma growing.
Integration Patterns and Anti-Patterns for Microservices ArchitecturesApcera
Integration Patterns and Anti-Patterns for Microservices Architectures
David Williams
Co-Founder and Partner, Williams Garcia
You can learn more about NATS at http://www.nats.io
Policy-based Cloud Storage: Persisting Data in a Multi-Site, Multi-Cloud WorldApcera
Apcera's Earl Ruby discusses the role of policy in cloud storage, microservices and container management at SF Microservices meetup. As organizations are building storage and infrastructure at scale, policy supports provisioning, security, performance and business logic.
What problems are we trying to solve?
Define “Scale”...
Cloud software has to to "play nice with others"
Policy for Provisioning, Security, Performance, and Business Logic
You can learn more about The Trusted Cloud Platform at: https://www.apcera.com/
Integration Patterns for Microservices ArchitecturesApcera
One of the fundamental principals of microservices is the idea of lightweight, composable loosely coupled applications that can either talk through some type of service endpoint, through some protocol like HTTP or through pipes.
A lightweight messaging system such as NATS is a better way for microservices to talk to each other and integrate disparate systems outside the microservice or architecture.
You can learn more about NATS at http://www.nats.io
NATS was created by Derek Collison, founder and CEO
of Apcera, who has spent 20+ years designing, building, and using publish-subscribe messaging systems.
Unlike traditional enterprise messaging systems, NATS has an always-on dial tone that does whatever it takes to remain available. Learn how end users are building modern, reliable and scalable cloud and distributed systems with NATS.
Talk given by David Williams, Principal, Williams & Garcia
You can learn more about NATS at http://www.nats.io
Apcera reviews the good, bad and the amazing, based on feedback collected from 250+ early adopters, of emerging microservices platforms and best practices.
You can learn more about The Trusted Cloud Platform at: https://www.apcera.com/
Apcera: Agility and Security in Docker DeliveryApcera
Post Dockercon 2015 Technical Talk on Agility and Security in Docker Delivery
You can learn more about The Trusted Cloud Platform at: https://www.apcera.com/
Delivering Policy & Trust to the Hybrid CloudApcera
Enterprises are turning to the hybrid cloud to drive greater scalability and cost-effectiveness. But enterprises should beware, as the definition of “policy” varies wildly. Some say it’s the ability to control the resources apps’ use or where the apps run. Others view policy as governing the permissions and delivering security. Policy is all of that and more.
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Tobias Schneck
As AI technology is pushing into IT I was wondering myself, as an “infrastructure container kubernetes guy”, how get this fancy AI technology get managed from an infrastructure operational view? Is it possible to apply our lovely cloud native principals as well? What benefit’s both technologies could bring to each other?
Let me take this questions and provide you a short journey through existing deployment models and use cases for AI software. On practical examples, we discuss what cloud/on-premise strategy we may need for applying it to our own infrastructure to get it to work from an enterprise perspective. I want to give an overview about infrastructure requirements and technologies, what could be beneficial or limiting your AI use cases in an enterprise environment. An interactive Demo will give you some insides, what approaches I got already working for real.
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...DanBrown980551
Do you want to learn how to model and simulate an electrical network from scratch in under an hour?
Then welcome to this PowSyBl workshop, hosted by Rte, the French Transmission System Operator (TSO)!
During the webinar, you will discover the PowSyBl ecosystem as well as handle and study an electrical network through an interactive Python notebook.
PowSyBl is an open source project hosted by LF Energy, which offers a comprehensive set of features for electrical grid modelling and simulation. Among other advanced features, PowSyBl provides:
- A fully editable and extendable library for grid component modelling;
- Visualization tools to display your network;
- Grid simulation tools, such as power flows, security analyses (with or without remedial actions) and sensitivity analyses;
The framework is mostly written in Java, with a Python binding so that Python developers can access PowSyBl functionalities as well.
What you will learn during the webinar:
- For beginners: discover PowSyBl's functionalities through a quick general presentation and the notebook, without needing any expert coding skills;
- For advanced developers: master the skills to efficiently apply PowSyBl functionalities to your real-world scenarios.
Neuro-symbolic is not enough, we need neuro-*semantic*Frank van Harmelen
Neuro-symbolic (NeSy) AI is on the rise. However, simply machine learning on just any symbolic structure is not sufficient to really harvest the gains of NeSy. These will only be gained when the symbolic structures have an actual semantics. I give an operational definition of semantics as “predictable inference”.
All of this illustrated with link prediction over knowledge graphs, but the argument is general.
UiPath Test Automation using UiPath Test Suite series, part 4DianaGray10
Welcome to UiPath Test Automation using UiPath Test Suite series part 4. In this session, we will cover Test Manager overview along with SAP heatmap.
The UiPath Test Manager overview with SAP heatmap webinar offers a concise yet comprehensive exploration of the role of a Test Manager within SAP environments, coupled with the utilization of heatmaps for effective testing strategies.
Participants will gain insights into the responsibilities, challenges, and best practices associated with test management in SAP projects. Additionally, the webinar delves into the significance of heatmaps as a visual aid for identifying testing priorities, areas of risk, and resource allocation within SAP landscapes. Through this session, attendees can expect to enhance their understanding of test management principles while learning practical approaches to optimize testing processes in SAP environments using heatmap visualization techniques
What will you get from this session?
1. Insights into SAP testing best practices
2. Heatmap utilization for testing
3. Optimization of testing processes
4. Demo
Topics covered:
Execution from the test manager
Orchestrator execution result
Defect reporting
SAP heatmap example with demo
Speaker:
Deepak Rai, Automation Practice Lead, Boundaryless Group and UiPath MVP
UiPath Test Automation using UiPath Test Suite series, part 3DianaGray10
Welcome to UiPath Test Automation using UiPath Test Suite series part 3. In this session, we will cover desktop automation along with UI automation.
Topics covered:
UI automation Introduction,
UI automation Sample
Desktop automation flow
Pradeep Chinnala, Senior Consultant Automation Developer @WonderBotz and UiPath MVP
Deepak Rai, Automation Practice Lead, Boundaryless Group and UiPath MVP
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualityInflectra
In this insightful webinar, Inflectra explores how artificial intelligence (AI) is transforming software development and testing. Discover how AI-powered tools are revolutionizing every stage of the software development lifecycle (SDLC), from design and prototyping to testing, deployment, and monitoring.
Learn about:
• The Future of Testing: How AI is shifting testing towards verification, analysis, and higher-level skills, while reducing repetitive tasks.
• Test Automation: How AI-powered test case generation, optimization, and self-healing tests are making testing more efficient and effective.
• Visual Testing: Explore the emerging capabilities of AI in visual testing and how it's set to revolutionize UI verification.
• Inflectra's AI Solutions: See demonstrations of Inflectra's cutting-edge AI tools like the ChatGPT plugin and Azure Open AI platform, designed to streamline your testing process.
Whether you're a developer, tester, or QA professional, this webinar will give you valuable insights into how AI is shaping the future of software delivery.
GraphRAG is All You need? LLM & Knowledge GraphGuy Korland
Guy Korland, CEO and Co-founder of FalkorDB, will review two articles on the integration of language models with knowledge graphs.
1. Unifying Large Language Models and Knowledge Graphs: A Roadmap.
https://arxiv.org/abs/2306.08302
2. Microsoft Research's GraphRAG paper and a review paper on various uses of knowledge graphs:
https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Ramesh Iyer
In today's fast-changing business world, Companies that adapt and embrace new ideas often need help to keep up with the competition. However, fostering a culture of innovation takes much work. It takes vision, leadership and willingness to take risks in the right proportion. Sachin Dev Duggal, co-founder of Builder.ai, has perfected the art of this balance, creating a company culture where creativity and growth are nurtured at each stage.
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf91mobiles
91mobiles recently conducted a Smart TV Buyer Insights Survey in which we asked over 3,000 respondents about the TV they own, aspects they look at on a new TV, and their TV buying preferences.
JMeter webinar - integration with InfluxDB and GrafanaRTTS
Watch this recorded webinar about real-time monitoring of application performance. See how to integrate Apache JMeter, the open-source leader in performance testing, with InfluxDB, the open-source time-series database, and Grafana, the open-source analytics and visualization application.
In this webinar, we will review the benefits of leveraging InfluxDB and Grafana when executing load tests and demonstrate how these tools are used to visualize performance metrics.
Length: 30 minutes
Session Overview
-------------------------------------------
During this webinar, we will cover the following topics while demonstrating the integrations of JMeter, InfluxDB and Grafana:
- What out-of-the-box solutions are available for real-time monitoring JMeter tests?
- What are the benefits of integrating InfluxDB and Grafana into the load testing stack?
- Which features are provided by Grafana?
- Demonstration of InfluxDB and Grafana using a practice web application
To view the webinar recording, go to:
https://www.rttsweb.com/jmeter-integration-webinar
How world-class product teams are winning in the AI era by CEO and Founder, P...
The Zen of High Performance Messaging with NATS
1.
The Zen of High Performance
Messaging with NATS
Waldemar Quevedo / @wallyqs
Strange Loop 2016
2. ABOUT
Waldemar Quevedo /
Software Developer at in SF
Development of the Apcera Platform
Past: PaaS DevOps at Rakuten in Tokyo
NATS client maintainer (Ruby, Python)
@wallyqs
Apcera
5. NATS
High Performance Messaging System
Created by
First written in in 2010
Originally built for Cloud Foundry
Rewritten in in 2012
Better performance
Open Source, MIT License
Derek Collison
Ruby
Go
https://github.com/nats-io
6. THANKS GO TEAM
Small binary → Lightweight Docker image
No deployment dependencies ✌
16. LESS IS BETTER
Concise feature set (pure pub/sub)
No built-in persistence of messages
No exactly-once-delivery promises either
Those concerns are simpli ed away from NATS
25. Not following ping/pong interval, results in server
disconnecting us.
INFO {"auth_required":false,"max_payload":1048576,...}
PING
PING
-ERR 'Stale Connection'
Connection closed by foreign host.
26. Subscribe to the hellosubject identifying it with the
arbitrary number 10
sub hello 10
+OK
28. Message received!
telnet demo.nats.io 4222
sub hello 10
+OK
pub hello 5
world
MSG hello 10 5
world
Payload is opaque to the server!
It is just bytes, but could be json, msgpack, etc…
30. PROBLEM
How can we send a request and expect a response back
with pure pub/sub?
31. NATS REQUESTS
Initially, client making the request creates a subscription
with a string:unique identi er
SUB _INBOX.ioL1Ws5aZZf5fyeF6sAdjw 2
+OK
NATS clients libraries have helpers for generating these:
nats.NewInbox()
// => _INBOX.ioL1Ws5aZZf5fyeF6sAdjw
32. NATS REQUESTS
Then it expresses in the topic:limited interest
SUB _INBOX.ioL1Ws5aZZf5fyeF6sAdjw 2
UNSUB 2 1
tells the server to unsubscribe from subscription with sid=2
after getting 1 message
33. NATS REQUESTS
Then the request is published to a subject (help), tagging it
with the ephemeral inbox just for the request to happen:
SUB _INBOX.ioL1Ws5aZZf5fyeF6sAdjw 2
UNSUB 2 1
PUB help _INBOX.ioL1Ws5aZZf5fyeF6sAdjw 6
please
34. NATS REQUESTS
Then i there is another subscriber connected and
interested in the helpsubject, it will receive a message
with that inbox:
# Another client interested in the help subject
SUB help 90
# Receives from server a message
MSG help 90 _INBOX.ioL1Ws5aZZf5fyeF6sAdjw 6
please
# Can use that inbox to reply back
PUB _INBOX.ioL1Ws5aZZf5fyeF6sAdjw 11
I can help!
35. NATS REQUESTS
Finally, i the client which sent the request is still connected
and interested, it will be receiving that message:
SUB _INBOX.ioL1Ws5aZZf5fyeF6sAdjw 2
UNSUB 2 1
PUB help _INBOX.ioL1Ws5aZZf5fyeF6sAdjw 6
please
MSG _INBOX.ioL1Ws5aZZf5fyeF6sAdjw 2 11
I can help!
41. MANY MORE AVAILABLE
C C# Java
Python NGINX Spring
Node.js Elixir Rust
Lua Erlang PHP
Haskell Scala Perl
Many thanks to the community!
42. ASYNCHRONOUS IO
Note: Most clients have asynchronous behavior
nc, err := nats.Connect()
// ...
nc.Subscribe("hello", func(m *nats.Msg){
fmt.Printf("[Received] %s", m.Data)
})
for i := 0; i < 1000; i ++ {
nc.Publish("hello", []byte("world"))
}
// No guarantees of having sent the bytes yet!
// They may still just be in the flushing queue.
43. ASYNCHRONOUS IO
In order to guarantee that the published messages have
been processed by the server, we can do an extra
ping/pong to con rm they were consumed:
nc.Subscribe("hello", func(m *nats.Msg){
fmt.Printf("[Received] %s", m.Data)
})
for i := 0; i < 1000; i ++ {
nc.Publish("hello", []byte("world"))
}
// Do a PING/PONG roundtrip with the server.
nc.Flush()
SUB hello 1rnPUB hello 5rnworldrn..PINGrn
Then ush the bu er and wait for PONGfrom server
44. ASYNCHRONOUS IO
Worst way of measuring NATS performance
nc, _ := nats.Connect(nats.DefaultURL)
msg := []byte("hi")
nc.Subscribe("hello", func(_ *nats.Msg) {})
for i := 0; i < 100000000; i++ {
nc.Publish("hello", msg)
}
45.
46. The client is a slow consumer since it is not consuming the
messages which the server is sending fast enough.
Whenever the server cannot ush bytes to a client fast
enough, it will disconnect the client from the system as
this consuming pace could a ect the whole service and rest
of the clients.
NATS Server is protecting itself
48. ALSO INCLUDED
Subject routing with wildcards
Authorization
Distribution queue groups for balancing
Cluster mode for high availability
Auto discovery of topology
Secure TLS connections with certi cates
/varzmonitoring endpoint
used by nats-top
49. SUBJECTS ROUTING
Wildcards: *
SUB foo.*.bar 90
PUB foo.hello.bar 2
hi
MSG foo.hello.bar 90 2
hi
e.g. subscribe to all NATS requests being made on the demo
site:
telnet demo.nats.io 4222
INFO {"auth_required":false,"version":"0.9.4",...}
SUB _INBOX.* 99
MSG _INBOX.ioL1Ws5aZZf5fyeF6sAdjw 99 11
I can help!
50. SUBJECTS ROUTING
Full wildcard: >
SUB hello.> 90
PUB hello.world.again 2
hi
MSG hello.world.again 90 2
hi
Subscribe to all subjects and see whole tra c going
through the server:
telnet demo.nats.io 4222
INFO {"auth_required":false,"version":"0.9.4",...}
sub > 1
+OK
51. SUBJECTS AUTHORIZATION
Clients are not allowed to publish on _SYSfor example:
PUB _SYS.foo 2
hi
-ERR 'Permissions Violation for Publish to "_SYS.foo"'
52. SUBJECTS AUTHORIZATION
Can customize disallowing pub/sub on certain subjects via
server con g too:
authorization {
admin = { publish = ">", subscribe = ">" }
requestor = {
publish = ["req.foo", "req.bar"]
subscribe = "_INBOX.*"
}
users = [
{user: alice, password: foo, permissions: $admin}
{user: bob, password: bar, permissions: $requestor}
]
}
56. COMMUNICATING WITHIN A
DISTRIBUTED SYSTEM
Just use HTTP everywhere?
Use some form of point to point RPC?
What about service discovery and load balancing?
What if sub ms latency performance is required?
57.
58. WHAT NATS GIVES US
publish/subscribe based low latency mechanism for
communicating with 1 to 1, 1 to N nodes
An established TCP connection to a server
A dial tone
60. HA WITH NATS CLUSTER
Avoid SPOF on NATS by assembling a full mesh cluster
61. HA WITH NATS CLUSTER
Clients reconnect logic is triggered
62. HA WITH NATS CLUSTER
Connecting to a NATS cluster of 2 nodes explicitly
srvs := "nats://10.240.0.11:4222,nats://10.240.0.21:4223"
nc, _ := nats.Connect(srvs)
Bonus: Cluster topology can be discovered dynamically too!
73. HEARTBEATS → DISCOVERY
Heartbeats can help too for discovering services via
wildcard subscriptions.
nc, _ := nats.Connect(nats.DefaultURL)
// SUB service.*.heartbeats 1rn
nc.Subscribe("service.*.heartbeats", func(m *nats.Msg) {
// Heartbeat from service received
})
77. DISTRIBUTION QUEUES
Service A workers subscribe to service.Aand create
workersdistribution queue group for balancing the work.
nc, _ := nats.Connect(nats.DefaultURL)
// SUB service.A workers 1rn
nc.QueueSubscribe("service.A", "workers",
func(m *nats.Msg) {
nc.Publish(m.Reply, []byte("hi!"))
})
82. LOWEST LATENCY RESPONSE
NATS requests were designed exactly for this
nc, _ := nats.Connect(nats.DefaultURL)
t := 250*time.Millisecond
// Request sets to AutoUnsubscribe after 1 response
msg, err := nc.Request("service.B", []byte("help"), t)
if err == nil {
fmt.Println(string(msg.Data))
// => sure!
}
nc, _ := nats.Connect(nats.DefaultURL)
nc.Subscribe("service.B", func(m *nats.Msg) {
nc.Publish(m.Reply, []byte("sure!"))
})
83. UNDERSTANDING NATS TIMEOUT
Note: Making a request involves establishing a client
timeout.
t := 250*time.Millisecond
_, err := nc.Request("service.A", []byte("help"), t)
fmt.Println(err)
// => nats: timeout
This needs special handling!
84. UNDERSTANDING NATS TIMEOUT
NATS is re and forget, reason for which a client times out
could be many things:
No one was connected at that time
service unavailable
Service is actually still processing the request
service took too long
Service was processing the request but crashed
service error
85. CONFIRM AVAILABILITY OF
SERVICE NODE WITH REQUEST
Each service node could have its own inbox
A request is sent to service.Bto get a single response,
which will then reply with its own inbox, (no payload
needed).
If there is not a fast reply before client times out, then
most likely the service is unavailable for us at that time.
If there is a response, then use that inbox in a request
SUB _INBOX.123available 90
PUB _INBOX.123available _INBOX.456helpplease...
87. NATS is a simple, fast and reliable solution for the internal
communication of a distributed system.
It chooses simplicity and reliability over guaranteed
delivery.
Though this does not necessarily mean that guarantees of a
system are constrained due to NATS!
→ https://en.wikipedia.org/wiki/End-to-end_principle
88. We can always build strong guarantees on top, but
we can't always remove them from below.
Tyler Treat, Simple Solutions to Complex Problems
Replayability can be better than guaranteed delivery
Idempotency can be better than exactly once delivery
Commutativity can be better than ordered delivery
Related NATS project: NATS Streaming
89. REFERENCES
High Performance Systems in Go (Gophercon 2014)
Derek Collison ( )
Dissecting Message Queues (2014)
Tyler Treat ( )
Simplicity Matters (RailsConf 2012)
Rich Hickey ( )
Simple Solutions for Complex Problems (2016)
Tyler Treat ( )
End To End Argument (1984)
J.H. Saltzer, D.P. Reed and D.D. Clark ( )
link
link
link
link
link