【问题标题】:How to push tables through socket如何通过套接字推表
【发布时间】:2015-01-27 10:08:53
【问题描述】:

考虑到kdb+ tick 的设置,表是如何通过套接字推送的?

tick 中,可以使用进程(比如说)a 订阅 tickerplant,然后将订阅的“代码”的数据推送到 @987654326 @随着新数据的到来。

我也想这样做,但我想知道怎么做。据我所知,q 进程之间的进程间通信只是将命令从一个进程传输到另一个进程的能力,以便命令将在另一个进程上执行。

那么如何在进程之间传输一个完整的表呢?

我知道在 tick 中执行此操作的方法是 .u.pub.u.sub,但我不清楚这些表是如何在进程之间传输的。

所以我有两个问题:

  • kdb+ tick 是如何做到这一点的?
  • 一般而言,如何将表从一个进程推送到另一个进程?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    让我们了解一下这样做的简单过程:

    我们有一台服务器“S”和一台客户端“C”。当“C”调用 .u.sub 函数时,该函数代码使用其主机和端口连接到“S”,并使用订阅参数调用“S”上的特定函数(比如说“请求”)。

    收到此请求后,“S request”函数会在其为订阅请求维护的订阅表中创建以下条目。

    -> 客户端的主机和端口(传入请求)

    -> 订阅参数(例如,客户发送 sym `VOD.L 进行订阅)

    现在,当“S”从提要中获取任何数据更新时,它会遍历它的订阅表并检查订阅参数列值(在我们的例子中为 sym)与传入数据匹配的条目。然后,它使用表中的主机和端口连接到它们中的每一个,并使用新数据调用它们的“upd”函数。

    唯一的问题是,客户端应该在他们身边定义“upd”函数。

    这是一个非常基本的过程。 KDB+ 将其与额外的优化和功能一起使用。例如。更优化的结构维护订阅表,日志维护,重播日志,取消订阅,恢复逻辑,发布定时器等等。

    更多细节,你可以查看 'u' 命名空间中的函数定义。

    【讨论】:

    • 谢谢,这是一个非常可靠的解释。我只想了解一件事:''Then it makes connection to each of them using their host and port from table and call their 'upd' function with new data.''。它如何将这些新数据发送到客户端?
    • 它可以在收到请求时第一次处理并存储它以供将来通信。要处理: h:hopen`:host:port 。检查 kx wiki 上的“打开”。使用句柄发送数据:h (function;func_params)。这将调用客户端函数。例如:h (upd;table_name;table_data)
    • 我明白(实际上我已经在使用这样的句柄),但我想知道如何发送数据。这是逐行完成的吗?所以发送意味着我将简单地在客户端进程上调用insert[table_name;(DATA)]?这是最好的方法吗?
    • 哦...您可以使用句柄一次发送完整数据并在客户端一次插入。批量插入比多行插入更快。
    • 客户端这将是您提到的简单插入。问题是服务器将如何发送它。如果您在 tcp 缓冲区限制中有行(这是实时馈送的情况),服务器可以像 h(upd;trade;select from trade where sym=VOD.L) 一样立即发送。如果它们超出限制,您可以像 { h(upd;trade;x) } each 1000 cut select from trade where sym=VOD.L . 1000 仅作为示例一样打破它们,您可以根据您的应用程序对其进行调整。
    猜你喜欢
    • 1970-01-01
    • 2017-02-09
    • 2012-10-27
    • 2012-04-19
    • 2016-11-19
    • 1970-01-01
    • 2021-09-30
    • 2015-03-05
    • 2021-01-27
    相关资源
    最近更新 更多