【问题标题】:Frameworks for creating asynchronous streaming API用于创建异步流 API 的框架
【发布时间】:2013-08-06 01:49:06
【问题描述】:

我们应用程序的架构由几个模块组成。这些模块可以作为单个进程运行,也可以在不同的服务器上单独运行。当模块位于不同的服务器上时,我们使用 REST 进行模块之间的交互。现在我们需要处理模块之间的流数据。一个模块发送请求——另一个模块异步发回数据块(对象)。我们尝试使用 KryoNet 和 Apache Mina。我们选择了最后一个,总的来说一切正常。但是解决方案有几个问题,有种重新发明轮子的感觉。

也许有现成的框架可用于创建异步 API 以传输流数据并支持多种传输和内置序列化:

  • 本地——当模块/服务在单个进程中交互时
  • netty 或模拟 -- 当模块在不同机器上相互交互时
  • REST -- 通过 HTTP 与模块交互

类似于 elasticsearch Java API——所有操作都可以通过网络、本地或通过 REST 异步执行。 有没有现成的框架来创建这样的 API?

我们使用的是 Scala 2.10 和 Java。

【问题讨论】:

  • vert.x 是一个成熟的异步通信框架。
  • vert.x 是否支持不同的传输和内置序列化来创建如上所述的 API?

标签: java scala asynchronous elasticsearch netty


【解决方案1】:

finagle 怎么样? https://github.com/twitter/finagle

它并不能满足您开箱即用的所有需求,但它是一个非常不错且可扩展的框架,并且可以为构建提供良好的基础。

你可以看到一个使用 finagle 做流媒体服务器的例子: https://github.com/twitter/finagle/blob/master/finagle-example/src/main/scala/com/twitter/finagle/example/stream/StreamServer.scala

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      我建议Scramjet。它适用于您的本地和模拟案例,但是当给定一个在管道中具有多个 REST API 的任务时,它只会发光 - 在这种情况下,它以对数方式扩展,而其他流系统以指数方式扩展(!)。这是一个基准scramjet-benchmark on GitHub

      它可以使用一系列简单的 lambda 进行编程,并且基于 node.js 以及所有过多的异步模块,您将能够在一行中运行所有 REST 服务(我建议您尝试 request-promise )。一个简单的案例如下所示:

      const scramjet = require("scramjet");
      const request = require("request-promise");
      
      process.stdin.pipe(new scramjet.StringStream())
          .split("\r?\n")
          .map((uri) => request.get("https://example.com/" + uri))
          .filter((data) => data.status === 200 && data.articleUrl)
          .map((data) => request.get("http://somesite.org/" + data.articleUrl)
          .accumulate((data) => database.put(data.key, data))
          .then(() => console.log('finished'))
      

      这就是调用两个 API 并将结果写入数据库的软件。

      【讨论】:

        猜你喜欢
        • 2015-08-25
        • 2015-03-09
        • 1970-01-01
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 2012-08-09
        • 1970-01-01
        相关资源
        最近更新 更多