【问题标题】:How do I run server-side code from couchdb?如何从 couchdb 运行服务器端代码?
【发布时间】:2010-08-11 21:12:54
【问题描述】:

Couchdb 非常擅长存储和提供数据,但我在掌握如何使用它进行后端处理时遇到了一些麻烦。例如,GWT 开箱即用地支持同步和异步回调,允许您在服务器上运行任意 Java 代码。有没有办法用 couchdb 做这样的事情?

例如,当用户单击 Web 应用程序的按钮时,我想生成并提供 PDF 文件。理想情况下,工作流程应如下所示:

  • 用户输入了一些数据
  • 用户点击生成按钮
  • 调用服务器,并在服务器端生成 PDF。服务器代码可以用任何语言编写,但最好是 Java。
  • PDF 生成完成后,系统会提示用户下载并保存文档。

有没有办法使用开箱即用的 couchdb 来做到这一点,或者是否需要一些额外的第三方软件在 Web 客户端和后端数据处理代码之间进行通信?

编辑:看起来我在解释我的问题方面做得很差。我感兴趣的本质上是从 Couchdb 提供 servlet,类似于您可以从 war 文件中的侧面网页提供 Java servlet。我使用 GWT 作为示例,因为它支持一起开发 servlet 和客户端代码并将所有内容编译到单个 war 文件中。我会对这样的事情非常感兴趣,因为它可以通过 Couchdb 复制轻松部署功能齐全的网站。

但是,从表面上看,我的问题的答案是否定的,您不能从 couchdb 提供 servlet。数据库是为 CRUD 样式交互而设置的,任何 servlet 样式的组件都需要单独提供服务,或者通过轮询数据库的更改并采取相应措施来完成。

【问题讨论】:

    标签: couchdb soa


    【解决方案1】:

    以下是我建议的一般工作流程:

    1. 当用户单击“生成”时:序列化他们输入的数据和任何其他相关元数据(例如优先级、用户名)并将其作为新文档发布到 couchdb。跟踪文档的 _id。
    2. 编写一个后台进程,用于监控 couchdb 中需要处理的文档。
    3. 当它看到这样的文档时,让它生成 PDF 并将其附加到同一个沙发文档中。
    4. 现在回到客户端。您可以使用 ajax 轮询重复获取沙发文档并测试是否有附件。如果是,那么您可以向用户显示下载链接。

    当然,魔鬼在细节中......

    您的后台进程可以通过两种方式识别待处理文档:

    • 使用_changes API 监控新文档,_rev 以“1-”开头
    • 在仅返回没有“_attachments”属性的文档的 couchdb 视图上发出请求。当没有要处理的文件时,它不会返回任何内容。
      • 可选:如果您有多个 PDF 制作进程在队列上并行工作,您将需要使用 {"being-processed":true} 之类的属性更新沙发文档,并将它们过滤掉视图。

    其他一些想法:

    • 我不建议在此用例中使用 couchdb 外部 API,因为它(基本上)意味着 couchdb 和您的 PDF 生成代码必须在同一台机器上。但这需要注意。
    • 我对 GWT 一无所知,但似乎没有必要实现您的目标。当然,CouchDB 可以提供您想要的任何静态文件(js 或其他)作为数据库或文件系统中文档的附件。您甚至可以将 eval() JSON 属性放入沙发文档中。因此,您可以使用 GWT 进行 ajax 调用或其他任何操作,但 GWT 可以与 couchdb 完全分离。那样可能会更简单。

    【讨论】:

      【解决方案2】:

      GWT 有两个部分。一个是 GWT 编译器转换为 Java 的客户端,另一个是 Servlet(如果您执行任何 RPC)。通常,您会在浏览器上运行您的客户端代码,然后当您进行任何 RPC 调用时,您会联系 Java Servlet 引擎(例如 Tomcat 或 Jetty 或...),这反过来又会调用您的持久层。

      GWT 确实能够通过 HTTP 执行 JSON 请求,巧合的是,这正是 CouchDB 所使用的。所以理论上应该是可以的。 (不知道有没有人试过)。会有几个问题。
      CouchDB 需要提供具有已编译 GWT 客户端代码的 .js 文件。
      我在您的案例中看到的主要问题是 couchDB 需要生成您的 PDF 文件,而 couchDB 只是一个存储引擎,通常不进行任何处理。如果你对 Erlang 编程语言有任何了解,我想你可以扩展它。

      【讨论】:

      • 我对在 couchdb 上运行 GWT 并不真正感兴趣,我实际上对复制 RPC 调用的功能感兴趣。是否有任何相当于 couchdb 的 Java Servlet 引擎?
      • @TwentyMiles 我试图解释的是您可以调用 CouchDB,但这只是数据访问 (CRUD)。为了能够进行任何处理,您需要有一个 Servlet 引擎,它从 CounchDB 获取数据,然后对其进行处理以生成 PDF。我提出的另一点是,您可以在 CouchDB 前面添加一个 Erlang 模块并调用它来进行处理(当然这不是微不足道的)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2014-03-06
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      相关资源
      最近更新 更多