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. 2-First scrum meeting-20151201

    前言 因为编译和数据库的影响,这学期的担子差点抗不起来……所以在老师的同情之下我们的第二阶段从今天开始正式开工.因为scrum meeting要求更新,所以配合其他作业,完成功能可能细化到模块部分. ...

  2. 个人作业-Week 1

    1)快速看完整部教材,列出你仍然不懂的5到10个问题,发布在你的个人博客上. Q1:"Scrum Master不是一个官,而是一个没有行政权力的沟通者,就像微软的PM那样.他/她同时还要在团 ...

  3. 项目Beta冲刺(团队)第七天

    1.昨天的困难 服务器部署出了问题,本地服务器差点崩掉 运行一直闪退,在查找哪里出现问题的路上一去不复返 2.今天解决的进度 成员 进度 陈家权 消息功能模块 赖晓连 问答功能模块 雷晶 部署服务器到 ...

  4. Leetcode题库——31.下一个排列

    @author: ZZQ @software: PyCharm @file: nextPermutation.py @time: 2018/11/12 15:32 要求: 实现获取下一个排列的函数,算 ...

  5. Linux命令01

    Linux简介及Ubuntu安装 Linux,免费开源,多用户多任务系统.基于Linux有多个版本的衍生.RedHat.Ubuntu.Debian 安装VMware或VirtualBox虚拟机.具体安 ...

  6. 深入理解JAVA虚拟机阅读笔记6——线程安全与锁优化

    线程安全:如果一个对象可以安全的被多个线程同时使用,那它就是线程安全的. 一.Java中的线程安全 1.不可变 不可变的对象一定是线程安全的.String.枚举类型.java.lang.Number的 ...

  7. innobackupx备份原理

    1.工具内容 该软件安装完成会有四个工具,如下所示: usr├── bin│ ├── innobackupex│ ├── xbcrypt│ ├── xbstream│ └── xtrabackup 其 ...

  8. MT【127】点对个数两题之一【图论】

    在平面上有\(n\) 个点$S={x_1,x_2\cdots,x_n}, $ 其中任意两个点之间的距离至少为 \(1\), 证明在这 \(n\) 个点中距离为 \(1\)的点对数不超过 \(3n\). ...

  9. 【刷题】洛谷 P4319 变化的道路

    题目描述 小 w 和小 c 在 H 国,近年来,随着 H 国的发展,H 国的道路也在不断变化着 根据 H 国的道路法,H 国道路都有一个值 \(w\) ,表示如果小 w 和小 c 通过这条道路,那么他 ...

  10. BZOJ 1014 火星人 | 平衡树维护哈希

    BZOJ 1014 火星人 题意 有一个字符串,三中操作:在某位置后面插入一个字符.修改某位置的字符.询问两个后缀的最长公共前缀. 题解 看到网上的dalao们都说这道题是平衡树,我就很懵x--平衡树 ...