【问题标题】:Mapping the heroku cedar model to a multithreaded application将 heroku cedar 模型映射到多线程应用程序
【发布时间】:2013-04-18 13:27:28
【问题描述】:

我并不真正了解 Heroku 的 dyno 和工作进程模型,因为它与单进程但多线程的基于 Java 的服务器有关。

例如:我如何知道(对于单个测功机)有多少处理器可用于我的后台线程?我是否需要使用 RabbitMQ 之类的东西并为每个后台处理任务创建一个单独的进程(应用程序)并在服务器和这些服务器之间进行通信?对于使用线程缓存执行器的一些计划任务来说似乎有点矫枉过正。是否应该将所有 Futures 都更改为进程间 Futures?

我想这归结为这个问题。我可以不再编写多线程服务器并扩展服务器进程可用的处理器以适应我的线程活动吗?或者我是否需要重构我的架构以使用单独的进程来实现并发?如果是前者,我需要工人还是只需要多个测功机?

谢谢。

【问题讨论】:

    标签: java spring heroku concurrency


    【解决方案1】:

    Heroku 支持多种并发模型,因此您希望如何构建应用程序完全取决于您。您可以访问完整的 Java 堆栈,因此如果在您的 Web 进程中作为多个线程运行更有意义,您绝对可以这样做,或者您始终可以在 RabbitMQ 或 Redis 之类的东西上将作业排入队列并单独处理它们工人测功机。如果工作量轻且与您的 Web 请求成正比,多线程更简单且有意义,因为它将与 Web dynos 一起扩展;但是,如果工作量很大,不成比例,和/或需要独立扩展,那么将其分解成一个单独的过程会更好。

    Heroku 最初只是一个 Ruby 平台,它没有与 Java 相同的线程功能,因此使用单独的 worker dyno 对 Ruby 来说更为重要,这反映在一些文档和示例中,这可能导致了你的困惑。幸运的是,使用 Java,您可以使用更多选项,并且可以使用最适合手头工作的选项。

    【讨论】:

    • 谢谢!我很难寻找如何配置这些线程模型。你能指点我一份文件吗?
    • 这里没有特定于 Heroku 的内容,因此任何有关 Java 并发的教程都可以使用。这是一个很好的起点:vogella.com/articles/JavaConcurrency/article.html。它涵盖了整个范围,包括低级线程和锁,您可能希望在实践中避免使用 java.util.concurrent 包中的新抽象,但仍然很好地理解它们,因为它们是整个系统的基础。如果您想对演员进行更高级别的抽象,请查看Akka
    • ...如果您确实想了解 Heroku 特定的 multi-dyno web/worker 方法如何在 Heroku 上与 Java 一起使用,请查看 devcenter.heroku.com/articles/…
    • 我不是这个意思。我非常熟悉 Java 和其他语言中的线程。但是,我不知道如何分配 Heroku 资源,以便它们为 single 进程拥有正确的 CPU 等。我所看到的是每个进程有一个 DYNO,它们的内存大小可以是 512M 或 1G。但是那个测功机的并发性呢?您链接的文章只是使用多个进程进行并发(进程间通信),但我正在寻找将 Heroku 配置为进程内并发。
    • Heroku 上不需要为进程内并发配置任何东西,因为它就像任何其他 Java 应用程序一样开箱即用。只需创建一个线程池并开始向它扔作业。这是一个简单的example of a multithreaded app running on Heroku,这是source code。至于 CPU 分配,除了选择 1X 或 2X dyno 之外,这不是您可以控制的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多