NATS Streaming

  NATS Streaming是一个以NATS为驱动的数据流系统且它的源码也是由Golang语言编写的。其中NATS Streaming服务是一个可执行的文件名为:nats-streaming-server。NATS Streaming与底层NATS服务平台无缝嵌入、扩展和互动。NATS Streaming服务作为开源软件在MIT许可下载,Apcera也积极的在维护和支持NATS Streaming 服务。

  以下为NATS Streaming与NATS服务整体关系结构图:

  

功能

  除了NATS平台核心的特性外,NATS Streaming提供了以下一些功能特性

 增强消息协议

  NATS Streaming使用谷歌协议缓冲区实现自己的增强型消息格式。这些消息通过二进制数据流在NATS核心平台进行传播,因此不需要改变NATS的基本协议。NATS Streaming信息包含以下字段:
      序列 - 一个全局顺序序列号为主题的通道
      主题 - 是NATS Streaming 交付对象
      答复内容 - 对应"reply-to"对应的对象内容
      数据 - 真是数据内容
      时间戳 - 接收的时间戳,单位是纳秒
      重复发送 - 标志这条数据是否需要服务再次发送
      CRC32 - 一个循环冗余数据校验选项,在数据存储和数据通讯领域里,为了保证数据的正确性所采用的检错手段,这里使用的是 IEEE CRC32 算法

 消息/事件的持久性

  NATS Streaming提供了可配置的消息持久化,持久目的地可以为内存或者文件。另外,对应的存储子系统使用了一个公共接口允许我们开发自己自定义实现来持久化对应的消息

 至少一次的发送

  NATS Streaming提供了发布者和服务器之间的消息确认(发布操作) 和订阅者和服务器之间的消息确认(确认消息发送)。其中消息被保存在服务器端内存或者辅助存储(或其他外部存储器)用来为需要重新接受消息的订阅者进行重发消息。

 发布者发送速率限定

  NATS Streaming提供了一个连接选项叫 MaxPubAcksInFlight,它能有效的限制一个发布者可能随意的在任何时候发送的未被确认的消息。当达到这个配置的最大数量时,异步发送调用接口将会被阻塞,直到未确认消息降到指定数量之下。

 每个订阅者的速率匹配/限制

  NATS Streaming运行指定的订阅中设置一个参数为 MaxInFlight,它用来指定已确认但未消费的最大数据量,当达到这个限制时,NATS Streaming 将暂停发送消息给订阅者,直到未确认的数据量小于设定的量为止

 以主题重发的历史数据

  新订阅的可以在已经存储起来的订阅的主题频道指定起始位置消息流。通过使用这个选项,消息就可以开始发送传递了:
      1. 订阅的主题存储的最早的信息
      2. 与当前订阅主题之前的最近存储的数据,这通常被认为是 "最后的值" 或 "初值" 对应的缓存
      3. 一个以纳秒为基准的 日期/时间
      4. 一个历史的起始位置相对当前服务的 日期/时间,例如:最后30秒
      5. 一个特定的消息序列号

 持久订阅

  订阅也可以指定一个“持久化的名称”可以在客户端重启时不受影响。持久订阅会使得对应服务跟踪客户端最后确认消息的序列号和持久名称。当这个客户端重启或者重新订阅的时候,使用相同的客户端ID 和 持久化的名称,对应的服务将会从最早的未被确认的消息处恢复

安装 NATS Streaming 服务

 提供了多种安装方式
  1. 从github上下载对应版本的二进制安装包进行安装
  2. 直接使用 go 命令进行一键式安装
  3. 如果是Docker环境下可以通过Docker hub上进行安装
  4. windows 和 macOS上也有对应的安装方式,具体的请查看官网 install

 我这里使用的是第二种方式即直接通过go命令进行安装

 $ go get github.com/nats-io/nats-streaming-server

 启动NATS Streaming服务

  1. 直接启动:

 $ nats-streaming-server

  如果看到以下内容说明启动成功了:

[] // ::13.735047 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.4.
[] // ::13.735131 [INF] STREAM: ServerID: P717ypV9bkgOlj0z4wNVl5
[] // ::13.737291 [INF] Starting nats-server version 0.9.
[] // ::13.737307 [INF] Listening for client connections on 0.0.0.0:
[] // ::13.738248 [INF] Server is ready
[] // ::14.024368 [INF] STREAM: Message store is MEMORY
[] // ::14.024401 [INF] STREAM: --------- Store Limits ---------
[] // ::14.024414 [INF] STREAM: Channels: *
[] // ::14.024417 [INF] STREAM: -------- channels limits -------
[] // ::14.024421 [INF] STREAM: Subscriptions: *
[] // ::14.024425 [INF] STREAM: Messages : *
[] // ::14.024442 [INF] STREAM: Bytes : 976.56 MB *
[] // ::14.024446 [INF] STREAM: Age : unlimited *
[] // ::14.024449 [INF] STREAM: --------------------------------

  2. 启动NATS Streaming服务并开启NATS监控

 $ nats-streaming-server -m 8222

注意:

  NATS Streaming 主题名称是不支持通配符的,在NATS中主题名是可以使用 * 和 > 的,这里不支持。
  其他的大部分和NATS一致,因为它就是基于NATS实现的

NATS Streaming使用

  1. 首先进入已经下载好的 nats-streaming-server 对应的路径,并启动

  $ cd $GOPATH/src/github.com/nats-io/nats-streaming-server
  $ go run nats-streaming-server.go

  2. 运行发布者(publisher)客户端并且发送消息到指定的主题上

  $ cd $GOPATH/src/github.com/nats-io/go-nats-streaming/examples
  $ go run stan-pub.go foo "msg one"
  Published [foo] : 'msg one'
  $ go run stan-pub.go foo "msg two"
  Published [foo] : 'msg two'
  $ go run stan-pub.go foo "msg three"
  Published [foo] : 'msg three'

  3. 运行订阅者(subscriber)客户端,使用 -all 参数来接受由发布者发布对应主题上的所有消息

  $ go run stan-sub.go --all -c test-cluster -id myID foo
  Connected to nats://localhost:4222 clusterID: [test-cluster] clientID: [myID]
  subscribing with DeliverAllAvailable
  Listening on [foo], clientID=[myID], qgroup=[] durable=[]
  [#] Received on [foo]: 'sequence:1 subject:"foo" data:"msg one" timestamp:1465962202884478817 '
  [#] Received on [foo]: 'sequence:2 subject:"foo" data:"msg two" timestamp:1465962208545003897 '
  [#] Received on [foo]: 'sequence:3 subject:"foo" data:"msg three" timestamp:1465962215567601196

  以上可以看到使用参数 -all 可以获取到所有发布的数据,其实还有一些其他的参数供我们使用,具体如下所示:

    --seq <seqno>           从指定的序列号开始
--all 接受所有发送的数据
--last 从上一次最后一次发送的那条数据开始
--since <duration> 从当前往前的时间段开始接收(例如:1s, 1hr, 具体可以参看:https://golang.org/pkg/time/#ParseDuration)
--durable <name>  永久订阅者的名称
--unsubscribe 退出时解除永久订阅

  如果想要使用 GoLang 语言自己代码开发的话,可以参看我的下一篇博客:NATS_13:NATS Streaming案例讲解

NATS_12:NATS Streaming详解的更多相关文章

  1. Hadoop Streaming详解

    一: Hadoop Streaming详解 1.Streaming的作用 Hadoop Streaming框架,最大的好处是,让任何语言编写的map, reduce程序能够在hadoop集群上运行:m ...

  2. NATS—协议详解(nats-protocol)

    NATS的协议是一个简单的.基于文本的发布/订阅风格的协议.客户端连接到 gnatsd(NATS服务器),并与 gnatsd 进行通信,通信基于普通的 TCP/IP 套接字,并定义了很小的操作集,换行 ...

  3. NATS_04:NATS协议详解

    NATS的协议是一个简单的.基于文本的发布/订阅风格的协议.客户端连接到 gnatsd(NATS服务器),并与 gnatsd 进行通信,通信基于普通的 TCP/IP 套接字,并定义了很小的操作集,换行 ...

  4. Spark详解

    原文连接 http://xiguada.org/spark/ Spark概述 当前,MapReduce编程模型已经成为主流的分布式编程模型,它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的 ...

  5. Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕

    Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...

  6. Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解

    Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...

  7. Spark Streaming性能调优详解

    Spark Streaming性能调优详解 Spark  2015-04-28 7:43:05  7896℃  0评论 分享到微博   下载为PDF 2014 Spark亚太峰会会议资料下载.< ...

  8. 10.Spark Streaming源码分析:Receiver数据接收全过程详解

    原创文章,转载请注明:转载自 听风居士博客(http://www.cnblogs.com/zhouyf/)   在上一篇中介绍了Receiver的整体架构和设计原理,本篇内容主要介绍Receiver在 ...

  9. Spark Streaming性能调优详解(转)

    原文链接:Spark Streaming性能调优详解 Spark Streaming提供了高效便捷的流式处理模式,但是在有些场景下,使用默认的配置达不到最优,甚至无法实时处理来自外部的数据,这时候我们 ...

随机推荐

  1. [BUAA OO]第二次博客作业

    第五次作业 这次作业是电梯系列作业的终极版,要求是使用多线程实现三部电梯的运行.这次作业的难点在于第一次运用多线程技术,对于线程中的行为并不了解,以及电梯功能的实现(如果之前作业采取的是扫描指令队列预 ...

  2. c# bitmap和new bitmap(bitmap)及在System.Drawing.Image.get_RawFormat()报错“参数无效”

    问题情境: 给picturebox赋image属性,我用一下代码,出错: Bitmap theBitmap = convertCameraData.display(rawDataArray, heig ...

  3. ASP.NET Forms身份验证概述

    表单身份验证允许您使用自己的代码对用户进行身份验证,然后在cookie或页面URL中维护身份验证令牌.表单身份验证通过FormsAuthenticationModule类参与ASP.NET页面生命周期 ...

  4. sqlserver结束和监视耗时的sql

    在对象资源管理器中右击服务器地址选择“活动和监视器”. 点击最近耗费大量资源的查询

  5. week3b:个人博客作业

    vs2013的初步使用 由于自己在写这篇博客的时候已经把vs2013安装完毕,就我写了. 这是2013的使用步骤 第一步 注释 箭头指的方向是“点击” 第二步 第三步 第四步 第5步 第六步 最后点击 ...

  6. JAVA自学日记——Part Ⅱ

    今天学习了类与对象,其中关于this关键字的用法,static静态变量与静态方法,以及引用传递需要特别注意一下. 首先是引用传递: 在本段程序中可以通过进行外部对类对象的属性赋值来更改,同时也可以通过 ...

  7. Swift-KVC构造函数中数据类型和私有属性

  8. C语言中Union类型的使用方法

    转自:http://blog.csdn.net/feimor/article/details/6858103 使用C语言时,常常使用struct,对于union类型却几乎没有用过,只知道它是联合类型, ...

  9. yum与rmp

    清理一切缓存[root@geust02 ~]# yum   clean  all  重建元数据[root@geust02 ~]# yum  makecache 查询vim相关的软件包[root@geu ...

  10. Python实现熵值法确定权重

    本文从以下四个方面,介绍用Python实现熵值法确定权重: 一. 熵值法介绍 二. 熵值法实现 三. Python实现熵值法示例1 四. Python实现熵值法示例2 一. 熵值法介绍 熵值法是计算指 ...