#低延迟 #lru-cache #resp #redis #table #idb #applications

jupiter

木星是一个库,通过 Redis 定义的 RESP 协议提供高吞吐量超低延迟服务。

47 个版本 (17 个稳定版)

3.1.4 2024年7月22日
3.1.3 2024年6月3日
3.1.2 2023年8月23日
3.1.1 2023年3月28日
0.0.1 2019年11月11日

缓存 中排名第 20

Download history 150/week @ 2024-06-01 19/week @ 2024-06-08 7/week @ 2024-06-15 2/week @ 2024-06-22 16/week @ 2024-06-29 52/week @ 2024-07-13 171/week @ 2024-07-20 247/week @ 2024-07-27 2/week @ 2024-08-03

每月下载量 472

MIT 许可证

545KB
9K SLoC

JUPITER

木星 是一个框架,用于包装 计算内存密集型 组件,将它们作为 高吞吐量超低延迟 服务提供给基于托管运行时(如 node.jsJavaRuby)构建的应用程序。木星使用由 Redis 使用的 RESP 协议,以保持与主机应用程序通信时的低开销。

我们在 scireum 使用 木星 与我们的开源 Java 框架 SIRIUS 结合使用,以构建基于 Web 的应用程序。 sirius-biz 提供了一系列工具,用于将 Java 应用程序连接到木星,并维护和监控操作。

除了提供定制服务的框架外,木星还提供了一些通用模块

  • LRU-Cache:一个具有智能刷新策略的大小受限缓存,可以使用协调的异步缓存更新模式(见 LRU.XGET)来维持低延迟响应时间。它还支持通过次要键进行缓存一致性(刷新)(见 LRU.PUTS / LRU.REMOVES)。
  • InfoGraphDB:提供快速灵活的静态数据库用于主数据。使用仓库,可以从S3存储桶或git仓库等加载主数据到快速查找表或代码集。这些允许执行各种查找、反向查找、“边打字边搜索”和自动翻译管理(即使是包含数千行/结构化文档的表格)。
  • 仓库:仓库用于从各种来源获取文件,并调用适当的加载器,以便数据可以被使用(例如作为IDB表或集合)。有关加载器的更多信息:[仓库](https://github.com/scireum/jupiter/blob/HEAD/../jupiter-rs/src/repository)。

更多信息和详细描述请参阅文档

部署

从部署角度来看,我们主要使用Docker,因此我们简单地记录到stdout并使用SIGHUP来检测关闭请求。

尽管Jupiter旨在作为库构建自定义服务,但Jupiter IO提供了一个独立的Docker镜像 - IO指的是木星的卫星,不是I/O操作 :)

Jupiter IO启用了所有模块(如上所述)。因此,您可以尝试通过调用

> docker run -p 2410:2410 scireum/jupiter-io:latest &
> redis-cli -p 2410

> PING or
> SYS.COMMANDS

请注意,两个卷/jupiter/config/jupiter/repository应该挂载到Docker卷或外部目录,以便在容器更新后保持数据活跃。

配置

配置是从settings.yml加载的 - 修改此文件会在框架内检测和分发。此外,还可以通过发送SYS.SET_CONFIG来推送特定应用程序的配置。

基本配置只需指定要绑定到的ip和端口(如果默认设置不可行)

server:
    host: "0.0.0.0"
    port: 2410

仓库

由于单个仓库可能被多个应用程序共享,这些应用程序总是将所有文件同步到它们的Jupiter服务器,因此文件可以放入命名空间,而配置可以确定哪些命名空间被启用

repository:
    namespaces: ["core", "test", "foo" ]

LRU缓存

每个缓存都可以配置以限制其大小并控制其生存期参数

caches:
    my_cache:
        # Specifies the maximal number of entries to store
        size: 1024
        # Specifies the maximal amount of memory to use (in bytes).
        # Supports common suffixes like: k, m, g, t
        max_memory: 1g
        # Specifies the soft time to live. After this period, an entry is considered stale
        # and will not be delivered by LRU.GET. However, LRU.XGET will deliver this entry
        # but mark it as stale. Supports common suffixes like: s, m, h, d
        soft_ttl: 15m
        # Specifies the hard time to live. After this persiod, neither LRU.GET nor LRU.XGET
        # will deliver this entry.
        hard_ttl: 1d
        # Specifies the refresh interval for LRU.XGET. If this command delivers a stale entry
        # (as defined by soft_ttl), it indicates that the entry is stale an should be
        # refreshed. However, once this has to be signalled to a client, it will no longer
        # request a refresh from other clients until either the entry has been refresehd or
        # this refresh interval has elapsed.
        refresh_interval: 30s

命令

如果所有模块都启用,则以下命令可用。

核心模块

  • SYS.COMMANDS列出所有可用命令。
  • SYS.CONNECTIONS列出所有活跃客户端连接。
  • SYS.KILL终止与给定ip的客户端的连接。

仓库

  • REPO.SCAN重新扫描本地磁盘上的本地仓库内容。这会在启动时自动发生,仅在仓库内容被外部进程更改时才需要。
  • REPO.FETCH file url指示后台演员从给定的url获取文件。请注意,只有在文件自上次获取以来已修改时,才会获取文件。
  • REPO.STORE file contents将给定的字符串内容存储在文件中。
  • REPO.FETCH_FORCED file url也会获取给定的文件,但不会像REPO.FETCH那样执行任何“最后修改”检查。
  • REPO.LIST 列出仓库中的所有文件。请注意,这将产生一种或多或少可读的输出,而 REPO.LIST raw 将返回一个数组,每个文件对应一个子数组,包含 文件名文件大小最后修改时间
  • REPO.DELETE file 从仓库中删除指定的文件。
  • REPO.INC_EPOCH 立即增加前台角色的纪元计数器,并安排后台任务增加后台纪元。在执行了一些仓库任务之后调用此功能,可以用来确定是否所有任务都已处理。
  • REPO.EPOCHS 读取前台和后台纪元。首先调用 REPO.INC_EPOCH 然后调用 REPO.EPOCHS,可以确定后台角色是否正在工作(下载文件或执行加载任务)或者一切是否已处理。由于 INC_EPOCH 通过后台循环处理,返回的纪元将不同,只要后台角色正在处理其他任务。一旦前台纪元和后台纪元相同,可以假设所有仓库任务都已处理。

LRU缓存

  • LRU.PUT cache key value 将将给定的值存储在给定的缓存中。
  • LRU.PUTS cache key value secondary_key1 .. secondary_keyN 将将给定的值存储在给定的缓存中。请注意,只能使用给定的键查询值,但可以使用其中一个给定的次级键使用 LRU.REMOVES 从缓存中删除。
  • LRU.GET cache key 将在给定的缓存中查找给定的键,并返回存储的值或空字符串,如果没有值。
  • LRU.XGET 缓存键 的行为与 LRU.GET 相同。然而,它的输出更加详细。它总是会响应三个值:ACTIVE、REFRESH、VALUE。如果给定键没有找到值,ACTIVE 和 REFRESH 将为 0,VALUE 将为空字符串。如果找到一个非过期的条目,ACTIVE 为 1,REFRESH 为 0,VALUE 将是与键关联的值。现在有趣的部分来了:如果找到一个过期的条目(比 soft_ttl 旧但比 hard_ttl 新),ACTIVE 将为 0。对于第一个请求此条目的客户端,REFRESH 将为 1,VALUE 将是与键关联的过期值。对于此命令的后续调用,REFRESH 将为 0,直到条目被更新(通过调用 LRU.PUT)或者自第一次调用以来已经过去了 refresh_interval。使用这种方法,可以构建“懒”缓存,这些缓存按需刷新,而不会减慢请求客户端的速度(如果应用程序接受这样做,过期的内容可以快速提供)并且不会过载系统,因为通常只有一个客户端会尝试获取一个新值而不是所有客户端同时尝试。
  • LRU.REMOVE 缓存键 将删除与给定键关联的值。请注意,值将立即消失,而不考虑任何 TTL。
  • LRU.REMOVES 缓存二级键 将删除使用 LRU.PUTS 与给定二级键关联的所有值。
  • LRU.FLUSH 缓存 将清除给定缓存的所有内容。
  • LRU.STATS 将提供所有活动缓存的概述。 LRU.STATS 缓存 将提供给定缓存的详细度量。
  • LRU.KEYS 缓存过滤器 可以用来检索所有包含给定过滤器的键(在其键中)。请注意,过滤器也可以省略。然而,在任一种情况下,都将返回前 100 个匹配项。

InfoGraphDB

  • IDB.LOOKUP 表搜索路径过滤器值路径1 路径2 路径3 在给定的搜索路径(内部字段由 "." 分隔)内对给定表中的给定过滤器值执行查找。如果找到结果,将提取 path1..pathN 的值并返回。如果没有给出路径,则返回匹配项的数量。如果有多个文档匹配,则仅返回第一个。请注意,如果路径匹配内部对象(特别是对于 "."),结果将包装为 JSON。请注意,IDB.LOOKUP 默认情况下是 区分大小写 的。但是,如果查询的字段上放置了全文索引,并且给定的过滤器值已经是小写,则可以执行不区分大小写的查找。这可以用于例如反向查找,以在某种(或任何)语言中找到给定文本的代码。有关最终定义 IDB 中的表及其索引的加载器的描述,请参阅 仓库
  • IDB.ILOOKUP 表 primary_lang 回退_lang 搜索路径 过滤值 路径1 的行为与 IDB.LOOKUP 相同。然而,如果给定的提取路径之一指向一个内部映射,我们期望这是一个翻译映射,我们首先尝试找到主语言的价值,如果回退语言中没有找到,则返回。注意,如果两种语言都未能产生值,我们将尝试使用 xx 作为语言代码来解决最终的回退。如果所有这些尝试都失败了,我们输出一个空字符串。注意因此当使用 ILOOKUP 时,不可能返回内部映射,ILOOKUP 通常是用于除翻译以外的任何事物。然而,使用适当的路径提取单个值仍然有效。有关详细信息,请参阅 IDB.LOOKUP,了解此处的区分大小写问题以及不区分大小写的情况。
  • IDB.QUERY 表 num_skip 最大结果数 搜索路径 过滤值 路径1 的行为与查找类似,但它不仅返回第一个结果,而且还跳过前 num_skip 个结果,然后输出最多 max_result 行。请注意,这同样受限于最多 1000。有关详细信息,请参阅 IDB.LOOKUP,了解此处的区分大小写问题以及不区分大小写的情况。
  • IDB.QUERY 表 primary_lang 回退_lang num_skip 最大结果数 搜索路径 过滤值 路径1 提供了与 IDB.ILOOKUPIDB.LOOKUP 的 i18n 查找基本相同的查找。有关详细信息,请参阅 IDB.LOOKUP,了解此处的区分大小写问题以及不区分大小写的情况。
  • IDB.SEARCH 表 num_skip 最大结果数 搜索路径 过滤值 路径1 在所有给定的 搜索路径 中执行搜索。这可以是像 "path1,path2,path3" 这样的逗号分隔列表,或者是一个 "*" 以选择所有字段。注意,对于给定的搜索值,这将进行不区分大小写的匹配,并且对于检测到的文档(选定的字段)中的单词的前缀也是如此。其余的行为与 IDB.QUERY 相同。另外,请注意,对于每个被查询的字段,必须存在全文索引。
  • IDB.ISEARCH 表 primary_lang 回退_lang num_skip 最大结果数 搜索路径 过滤值 路径1 为生成的结果添加 i18n 查找,就像 IDB.IQUERYIDB.ILOOKUP 一样。
  • IDB.SCAN 表 num_skip 最大结果数 路径1 路径2 路径3 通过跳过表中的前 num_skip 个条目,然后输出最多 max_results 行,输出所有结果。
  • IDB.ISCAN 表 primary_lang fallback_lang num_skip max_results path1 path2 path3 同样,其行为与 IDB.SCAN 相同,但提供了针对给定语言的国际化查找。
  • IDB.LEN 报告给定表中的条目数量
  • IDB.SHOW_TABLES 报告所有表及其使用统计信息。
  • IDB.SHOW_SETS 报告所有集合及其使用统计信息。
  • IDB.CONTAINS 集合 key1 key2 key3 报告给定的键是否包含在给定的集合中。对于每个键,将报告 1(包含)或 0(不包含)。
  • IDB.INDEX_OF 集合 key1 key2 key3 报告给定键的插入索引,使用基于1的索引。
  • IDB.CARDINALITY 集合 报告给定集合中的条目数量

PyRun 内核

  • PY.RUN 内核 json 将给定的 JSON 发送到指定的内核,并返回结果。
  • PY.STATS 提供所有活动内核的概览。

源代码

贡献

欢迎以问题或拉取请求的形式做出贡献。请通过在每个提交末尾添加类似 "Signed-off-by: Name" 的行来 签名 所有的提交,表明您编写了代码并有权将其作为开源软件传递。

许可证

Jupiter 采用 MIT 许可证授权

特此授予任何获得本软件及其相关文档副本(“软件”)的人免费处理该软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,以及允许向提供软件的人这样做,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论此类索赔、损害或其他责任是基于合同、侵权或其他方式产生,与软件或其使用或其他方式相关。

依赖关系

~21–35MB
~599K SLoC