https://natsbyexample.com/examples/os/intro/dotnet2

NATS 中的对象存储能力是在 Stream 之上的一种抽象,它将消息的主题视为类似键值对中的键,但是其中的内容可以跨越多个数据块。使得它支持大型数据。并且通常作为可读/可写流进行加载和读取。

比较来说,Key-Value 存储限制保存的数据量为 1M, 而对象存储没有这个限制。

注意:对象存储不是分布式存储系统。所有存储的文件需要适应目标文件系统。

它支持客户端应用程序创建并存储一组文件的存储桶(对应于流)。文件以块的形式存储和传输,允许通过 NATS 基础设施安全地传输任意大小的文件。

1. 创建对象存储管理器

使用 JSContext 来创建对象存储的管理器 NatsObjContext

var opts = new NatsOpts
{
Url = url,
LoggerFactory = loggerFactory,
Name = "NATS-by-Example",
};
await using var nats = new NatsConnection(opts);
var js = new NatsJSContext(nats);
var objMgr = new NatsObjContext(js);

2. 创建命名的对象存储

借助对象管理器来创建一个命名的对象存储。每个对象存储可以看做一个字典。

var store = await objMgr.CreateObjectStore("configs");

3. 检查对象存储的状态

使用对象存储的 GetStatusAsync() 可以检查它的状态

var status = await store.GetStatusAsync();
logger.LogInformation("The object store has {Size} bytes", status.Info.State.Bytes);

Output

info: NATS-by-Example[0]
The object store has 0 bytes

4. 存储数据和元数据

使用 PutAsync() 将数据存储到对象存储中。除了数据本身之外,还可以附加描述数据的元数据。

如果重复使用相同的 Key 存储数据,新的数据将会覆盖旧的数据。

每块数据关联一个元数据的描述,可以通过它对数据进行说明。

const int bytes = 10_000_000;
var data = new byte[bytes]; var info = await store.PutAsync(key: "a", data);
logger.LogInformation("Added entry {Name} ({Size} bytes)- '{Description}'", info.Name, info.Size, info.Description); await store.UpdateMetaAsync("a", new ObjectMetadata { Name = "a", Description = "still large data" });

Output

info: NATS-by-Example[0]
Added entry a (10000000 bytes)- '(null)'

ObjectMetadata 有一个 Headers 的属性,支持字符串形式的键值对说明。

 public Dictionary<string, string[]>? Headers { get; set; }

5. 提取存储的数据

使用键值来提取存储的数据。

var data1 = await store.GetBytesAsync("a");
logger.LogInformation("Data has {Size} bytes", data1.Length);

Output

info: NATS-by-Example[0]
Data has 10000000 bytes

6. 删除对象存储

借助键值可以删除存储的数据。

await store.DeleteAsync("a");

7. 以字节流的方式存储和读取数据

可以使用字节流对象,而不是字节数组来存储和提取数据。

const int bytes = 10_000_000;
var data = new byte[bytes]; // 使用字节流提供数据
info = await store.PutAsync(new ObjectMetadata { Name = "b", Description = "set with a stream" }, new MemoryStream(data));
logger.LogInformation("Added entry {Name} ({Size} bytes)- '{Description}'", info.Name, info.Size, info.Description); // 使用字节流提取数据,数据被填充到流中
var ms = new MemoryStream();
info = await store.GetAsync("b", ms);
logger.LogInformation("Got entry {Name} ({Size} bytes)- '{Description}'", info.Name, info.Size, info.Description); await obj.DeleteObjectStore("configs", CancellationToken.None);

Output

info: NATS-by-Example[0]
Added entry b (10000000 bytes)- 'set with a stream'
info: NATS-by-Example[0]
Got entry b (10000000 bytes)- 'set with a stream'

8.管理对象存储

列出存储的数据

var count = 0;
await foreach (var entry in store.ListAsync())
{
logger.LogInformation("Entry {Name} ({Size} bytes)- '{Description}'", info.Name, info.Size, info.Description);
count++;
}
logger.LogInformation("The object store contains {Count} entries", count);

Output

info: NATS-by-Example[0]
Entry a (10000000 bytes)- '(null)'
info: NATS-by-Example[0]
The object store contains 1 entries
  1. 监控对象存储中的变更
var watcher = Task.Run(async () =>
{
await foreach (var m in store.WatchAsync(new NatsObjWatchOpts{IncludeHistory = false}))
{
logger.LogInformation(">>>>>>>> Watch: {Bucket} changed '{Name}' {Op}", m.Bucket, m.Name, m.Deleted ? "was deleted" : "was updated");
}
});

Output

info: NATS-by-Example[0]
>>>>>>>> Watch: configs changed 'a' was updated
  1. 使用 NATS CLI 管理对象存储

NATS CLI 提供了 object 命令管理对象存储

创建对象存储

nats object add myobjbucket

保存文件

nats object put myobjbucket ~/Movies/NATS-logo.mov

列出保存的对象

nats object ls myobjbucket

See: https://docs.nats.io/nats-concepts/jetstream/obj_store/obj_walkthrough

NATS: 对象存储的更多相关文章

  1. Minio对象存储

    目录 Minio对象存储 1.概述 2.功能特性 3.2.多节点 3.3.分布式 4.分布式minio集群搭建 4.1.集群规划 4.3.编写集群启动脚本(所有节点) 4.4.编写服务脚本(所有节点) ...

  2. [转载] 对象存储(2):OpenStack Swift——概念、架构与规模部署

    原文: http://www.testlab.com.cn/Index/article/id/1085.html#rd?sukey=fc78a68049a14bb228cb2742bdec2b9498 ...

  3. [转载] 文件系统vs对象存储——选型和趋势

    原文: http://www.testlab.com.cn/Index/article/id/1082.html#rd?sukey=fc78a68049a14bb2699b479d5e730f6f45 ...

  4. ios存储 plist 偏好设置 自定义对象存储

    1,plist Plist注意:不能存储自定义对象 Plist:数组和字典,  如何判断一个对象能不能使用Plist,就看下有没有writeToFile 获取应用的文件夹(应用沙盒) NSString ...

  5. git对象存储

    之前提到当存储数据内容时,会在objects文件夹下存储一个git对象.我们花些时间来看看 Git 是如何存储对象的.你将看来如何通过 Ruby 脚本语言存储一个 blob 对象 ,有必要了解一下对象 ...

  6. iOS使用阿里云OSS对象存储 (SDK 2.1.1)

    最近项目中用到了阿里云OSS对象存储,用来存储APP中图片.音频等一些数据.但坑爹的阿里云居然在11月20日将SDK版本更新到了2.1.1,然而网上给出的教程都是1.*版本的(针对iOS),两个版本所 ...

  7. OpenStack对象存储——Swift

    OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性.冗余和持久性.本文将从架构.原理 和实践等几方面讲述S ...

  8. Ceph对象存储网关中的索引工作原理<转>

    Ceph 对象存储网关允许你通过 Swift 及 S3 API 访问 Ceph .它将这些 API 请求转化为 librados 请求.Librados 是一个非常出色的对象存储(库)但是它无法高效的 ...

  9. 利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能

    原文:利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能 利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能1.在界面上添加几个checkbox和一 ...

  10. java开发之阿里云对象存储OSS和云数据库Memcache的使用

    web开发中标配:aliyun ECS(阿里云服务器),aliyun RDS(阿里云数据库),aliyun OSS(阿里云对象存储),aliyun Memcache(阿里云缓存数据库). 今天就介绍下 ...

随机推荐

  1. Kubernetes ReplicaSet 控制器(十九)

    前面我们一起学习了 Pod 的原理和一些基本使用,但是在实际使用的时候并不会直接使用 Pod,而是会使用各种控制器来满足我们的需求,Kubernetes 中运行了一系列控制器来确保集群的当前状态与期望 ...

  2. 【USB3.0协议学习】Topic3·三种Reset Events分析

    USB3.0中的三种Reset Events 1. PowerOn Reset PowerOn Reset被用来代指上电复位,当一个device接入到root hub或者外置hub的时候,该devic ...

  3. Android Qcom USB Driver学习(六)

    眼图基础知识与详解 10分钟教会你看眼图 USB2.0 HUB眼图调试经验总结 一篇文章教你如何全面了解眼图测试! 预加重与去加重对眼图的影响 关于 USB 通信阻抗匹配的问题 硬件调试--眼图几个经 ...

  4. CNN归纳偏好

    出处:Transformer为何能闯入CV界秒杀CNN? CNN 中的卷积运算由于使用了两个重要的空间约束,从而有助于视觉特征的学习和提取: 由于 CNN 权重共享机制,卷积层所提取的特征便具有平移不 ...

  5. Java日期时间API系列41-----根据毫秒值计算倒计时

    会有一个比较常见的需求,计算倒计时,比如,计算距离某时间剩余时间(27小时10分钟30秒.1天3小时10分钟30秒)或者已经进行了多长时间等.下面是2种实现代码:其中第一种超过1天会体现在小时上,比如 ...

  6. iOS程序执行顺序和UIViewController的生命周期

    一.程序的执行顺序 启动程序 --- -[AppDelegate application:didFinishLaunchingWithOptions:] ---   --- -[AppDelegate ...

  7. SaaS架构:中央库存系统架构设计

    大家好,我是汤师爷~ 近年来,越来越多的零售企业大力发展全渠道业务.在销售额增长上,通过线上的小程序.直播.平台渠道等方式,拓展流量变现渠道.在会员增长方面,通过多样的互动方式,全渠道触达消费者,扩大 ...

  8. 9.24 csp(没学会的网络流)

    T1.商品 因为边界 l , r 是线性移动的,所以答案可以线性改变,直接用set维护连续段(小于l的和大于r的)的个数,并维护ans即可. 因为set的一个小错误调了两个小时,代码打成了一坨,结果最 ...

  9. fiddler限速配置&mock配置

    一.限速配置 1.开启性能选项 2.找到对应的参数入口 3.修改对应的从参数 解释下 这2个参数是如何做到限速的 4.request-trickle-delay(上传数据限制) 默认值是300,他的意 ...

  10. 蚂蚁图团队GraphRAG支持社区摘要——Token相比微软直降50%

    今年5月份,我们在DB-GPT v0.5.6版本发布了蚂蚁首个开源GraphRAG框架,支持了多种知识库索引底座,并在文章<Vector | Graph:蚂蚁首个开源GraphRAG框架设计解读 ...