在为上述数据库创建将与Microsoft Bot框架正常工作的自定义适配器时,我计划在bot框架中创建类似于cosmosDBPartitionedStorage类的内容。

从我看来,从botbuilder存储中继承/实现了3种读,写和删除操作。

从数据库角度来看,在创建此适配器时必须考虑什么,而从阅读几层源代码中看不出来。例如initialize()。那是特定于宇宙的,对于我需要的解决方案,我应该如何解释呢?

我计划使用2个数据库,其中一个是Redis。我可以在Azure Redis实例中针对我的本地开发进行测试,我认为这是一个入门的好地方。简而言之,这最初是用于redis适配器的。



更新:我采用了仅Redis的集群解决方案,它很可靠。我无法实现并发检查,因为这必须是服务器端脚本,我将它们用于CRUD操作,而该脚本将在v2更新中更多地涉及到。

@mrichardson在以下答案中提供的帮助对于创建自己的数据存储非常有用。我也能够在TypeScript实现的单元测试中获得大多数重要的基础测试!除了并发测试之外的所有内容。

在使用Redis时,我能够通过RedisJson module创建与JSON兼容的适配器。这是您必须通过cmd或conf文件配置安装的Redis模块。

我使用的库是IORedis from Luin,学习曲线不一定很陡,不一定是他的库,但是与Redis的工作以及他的库,作为集群的集成以及使用RedisJson模块集成是一个很大的挑战!

因为要使用RedisJson模块,所以我必须对每个CRUD操作都使用LUA脚本load EVALSHA,如果该脚本尚未加载或由于任何原因而丢失,则回退到EVAL。失败后还会重新建立脚本。

我不确定使用EVALSHA LUA脚本进行读写操作是否会获得很大的性能提升,但是Redis文档似乎建议这样做。


脚本编写的一大优点是它能够以最小的延迟读取和写入数据,从而使读取,计算,写入等操作非常快(在这种情况下,流水处理无济于事,因为客户端需要在读取之前回复读取命令)它可以调用write命令)。


更重要的是,我之所以开始使用脚本是因为与IORedis客户端有关。它可以进行流水线操作,但是由于没有对RedisJson命令的本地支持,因此我不得不做一个自定义脚本(在IORedis中,它不允许进行流水线操作,但会为您带来评估)或创建我自己的EVALSHAEVAL后备方案。

看起来工作很棒!

该代码库用于RedisCluster,一旦完成一些调整,我将通过github和npm将其作为打字稿npm包发布。

输入还采用TTL设置,这对于Microsoft bot框架等消息传递应用程序来说是很好的安全性和性能抽象。

最佳答案

从我看来,从botbuilder存储中继承/实现了3种读,写和删除操作。


正确。这就是您真正需要的。只要您可以成功完成这些操作,它就可以正常工作。


从数据库角度来看,在创建此适配器时必须考虑什么,而从阅读几层源代码中看不出来。例如initialize()。那是特定于宇宙的,对于我需要的解决方案,我应该如何解释呢?


也正确。那是宇宙特定的。基本上,它:


创建数据库(如果不存在)
将现有的/创建的数据库存储为该类的属性,以便以后检查数据库是否存在时,它仅查找该类的属性,而无需发出HTTP请求
执行上述操作时锁定类,以防止并发问题


如果要先尝试检查数据库是否存在,然后再尝试任何类型的读/写操作,则需要类似initialization()的功能。最好使用这样的东西来使您的机器人过时(如果您更改/添加数据库之类的东西),但这不是必需的。


最初是用于redis适配器的。


不幸的是,我们没有任何Redis存储适配器,但是在构建您的存储适配器时,您可以查看以下其他一些存储适配器:


BF SDK Node Azure Adapters (currently Azure Blob, Cosmos)
BF Node MemoryStorage(不在生产​​中使用)
BF SDK C# Azure Adapters (currently Azure Blob, Cosmos)
BF C# MemoryStorage(不在生产​​中使用)
Community Repo Node Adapters (currently Azure-Table, MongoDb, MS SQL)
Community Repo C# Adapters (currently Elasticsearch and EntityFramework)


在编写您的文档时,如果您想确保它可以正常运行,我们可以提供一组存储基础测试。您的适配器应该全部通过。


Node StorageBaseTests (currently a PR)
Node implementation example (currently a PR)
C# StorageBaseTests
C# implementation example

10-07 17:02
查看更多