我想在服务器上运行图像处理alg,可以使用Web应用程序轻松交互。图像处理algos是Compute繁忙,并且在自定义构建库中可以使用。目前,我在Heroku上使用Ruby在Heroku的网站上。

实现此目的最好的架构是什么?从网站运行图像处理ALGO上获取图像 - 在网站上显示

我的大多数图像处理代码在C / C ++上。

我可以直接从Ruby上调用C / C ++代码吗?这可能是在heroku吗?

或者我应该设计一个系统,其中C / C ++代码公开了一些API,它可以在Ruby上调用Rails服务器?

有帮助吗?

解决方案

heroku通常使用小虚拟机实例,因此取决于您的处理有多沉重,可能不是建筑的最佳选择。但是,如果您确实使用它,我会这样做:

使用背景任务宝石进行处理。在单独的过程中跑步(称为工人而不是在Heroku术语中的Dyno)上运行。延迟作业是一个尝试和测试的解决方案,用于背景任务,具有与将其集成到heroku中的大量的在线信息,但是与Sidekiq相同的较新的线索,它在现代版本的Ruby中使用了新的线程系统。他们将允许在Dyno中完成一切,但我会说将所有背景处理远离WebServer Dynos,因此延迟作业(或类似)是有用的。

用于集成C / C ++,我还没有必要这样做。但是,我知道可以创建集成C或C ++代码并自然编译的宝石。只要你使用Ruby而不是JRuby,我认为Heroku应该对他们有一个问题。还有其他方法可以完成这一点,看起来特别有关这个主题的问题,例如

如何从Ruby中调用C ++函数

似乎需要创建一个扩展,然后创建一个gem以包含它。这些链接可能会或可能不有帮助。

http://www.rubyinside.com/how-to-create-a-ruby-extension-in-c-indunder-5-minutes-100.html

http://guides.rubygems.org/gems-with-extensions/

我建议制作一个宝石,因为我认为可能很难以其他方式将库或可执行文件用于Heroku实例。如果您不想使其公开,您可以将GEM存储在您的供应商目录中。

总的来,我将使用Web服务器上传到S3或无论您存储图像的位置(这可以在浏览器中直接完成,而不使用WebServer作为带AWS JS API的踏脚石。看看宝石有助于帮助。)

然后网络服务器可以请求后台任务来处理图像。

如果您没有存储它们,事情会变得更有趣...如果您使用的是背景任务,您需要一个数据库,因此您可以将图像数据传递给工人作为BLOB数据库。

我真的不会在web服务器dyno中做所有的处理,除非你真的偶尔击中这个东西。有多个用户,您会非常快速地击中瓶颈。

后台进程可以在图像表中设置标志,以便WebServer可以让用户知道处理完成时。 (您可以使用AJAX在上载完整屏幕上使用JS的信息进行调查)

当然,取决于许多因素,还有许多其他方式实现这一点。

道歉答案是模糊的,但问题非常开放。

祝你好运。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top