[HN Gopher] High-Performance server for NATS.io, the cloud and e...
       ___________________________________________________________________
        
       High-Performance server for NATS.io, the cloud and edge native
       messaging system
        
       Author : Kinrany
       Score  : 66 points
       Date   : 2023-07-21 22:04 UTC (2 days ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | xupybd wrote:
       | I'm using this in production. So far it's worked very well. Took
       | a few hours to setup with certificates. Now it just works.
        
         | zerbinxx wrote:
         | What do you run it on?
        
       | clumsysmurf wrote:
       | I'm curious how this compares with MQTT, there seems to be some
       | overlap.
       | 
       | I was looking to stream sensor data from a mobile device using
       | MQTT, but the Eclipse Paho Java client (1.2.5) hasn't seen a
       | release in 3 years and I found it to be pretty buggy. There are
       | lots of open issues on the GitHub page.
        
         | ozarker wrote:
         | MQTT is a protocol. Nats is a server that supports MQTT among
         | other things
        
       | pnpnp wrote:
       | I have been a huge advocate of NATS.
       | 
       | For anyone looking to support multiple message patterns on one
       | message bus, this is what you want to check out.
       | 
       | In AWS terms, it's like SNS/SQS/Kinesis all rolled into one bus &
       | very intuitive to work with.
        
         | vosper wrote:
         | Any thoughts on NATS' JetStream? Looks quite compelling, to me.
         | 
         | https://docs.nats.io/using-nats/developer/develop_jetstream
        
       | jitl wrote:
       | With all the message queue whatever thingies, as an outside I'm
       | quite confused about ideal use cases.
       | 
       | NATS vs MQTT vs Kafka vs Redis Queue vs Amazon SQS - how do they
       | all stack up?
        
         | atombender wrote:
         | NATS is not a queue. It's distributed pub/sub message broker
         | for communicating between applications.
         | 
         | NATS's only responsibility is to route messages in near-real-
         | time from publishers to consumers. Messages are ephemeral and
         | dropped immediately after delivery; if nobody is listening, the
         | messages vanish. Messages are only queued temporarily in RAM if
         | the consumer is busy, and they can get dropped if a consumer
         | doesn't handle them fast enough. In short, NATS is very
         | lightweight and fast, and designed for things that are
         | lightweight and fast. It's like a kind of distributed socket
         | mechanism, and works best as a communication primitive you
         | build stuff on top of (like TCP or UDP) rather than a fully
         | fledged system.
         | 
         | So it's very different from Kafka and other types of queues
         | that are durable and database-like. Kafka is good for "fat
         | pipes" that centralize data from producers into a log which is
         | then consumed by massively parallel sets of consumers, and you
         | don't constantly change this topology. NATS is good for
         | networks of fast-changing producers and consumers that send
         | small messages to each other, often one-on-one, although any
         | fan-out topology works. It's great for firehose-type routing.
         | For example, imagine you want your app to produce lots of
         | different kinds of telemetry. Your app just sends messages to a
         | topic "telemetry" or maybe a dotted topic like
         | "telemetry.iostats" or "telemetry.errors". Then a client can
         | "tap" into that topic by listening to it. If no client is
         | listening, the firehose goes nowhere. But then a client can tap
         | into "telemetry.errors" and get just the stream of error
         | messages. Topics are just strings, so you can create unique
         | topics for temporary things; an app can send a message to
         | another app like "hey, do some work and then send the result to
         | my temporary topic foobar726373".
         | 
         | NATS is particularly notable for its "just works" design. The
         | clustering, for example, ties together brokers with no effort.
         | Clients typically don't need any configuration at all, other
         | than the name of a NATS server.
         | 
         | NATS _can_ be used as a low-level component to build stateful
         | stuff. NATS Jetstream is a Kafka-like solution that stores
         | durable logs, and uses NATS as its communication protocol.
         | Liftbridge is another one.
        
           | zerbinxx wrote:
           | It is worth noting that the jetstream API (to me) (not that
           | experienced) to lack some of the features of Kafka w.r.t.
           | replayability - for instance I can't easily say "go back and
           | re-run messages from X point-in-time". Instead it may be
           | necessary to write custom handlers for replay or safeguard
           | your systems to be very idempotent (a good pattern in event
           | driven systems, but not one that is explicitly required by
           | Kafkaesque messaging systems).
        
         | Xeoncross wrote:
         | Queues are often used for two reasons: as a way to throttle
         | processing (just throw it into the queue and drain as you have
         | time) and a way to avoid state loss (process the queue item and
         | only ack/clear it once you've done X, Y, & Z. Of course there
         | are more uses, but these are the two most common.
         | 
         | Depending on the throughput you need, the number of clients
         | pulling/putting into the queue, and other things you can rule
         | out certain options. For example, Redis queue will be one of
         | the fastest choices - but is very limited in capacity (memory
         | size). SQS is basically unlimited capacity, but can often have
         | 150ms or more of time elapse between when you put the item in
         | and when it's available.
        
         | paulgb wrote:
         | MQTT is a protocol rather than an alternative to NATS; NATS
         | supports MQTT (https://docs.nats.io/running-a-nats-
         | service/configuration/mq...)
         | 
         | As far as ideal use cases, we use NATS for https://plane.dev in
         | two ways:
         | 
         | - As a message bus, it is a layer of abstraction on top of the
         | network. Instead of each node needing to establish a connection
         | to every node it needs to connect to, it just connects to a
         | NATS cluster and messages are routed by subject. This is great
         | for debugging because we can "wiretap" messages on a given
         | subject pattern and verify what's being sent. We even have a
         | service that listens on NATS subjects and conditionally turns
         | events into Slack messages.
         | 
         | - It has a built-in RAFT implementation (via JetStream), which
         | we piggyback on when we need to create consensus among nodes.
        
       ___________________________________________________________________
       (page generated 2023-07-23 23:00 UTC)