java - 在 Heroku 上扩展 Spring

标签 java spring maven heroku

我想知道是否有人可以向我指出一篇关于编写 Spring 应用程序的好教程或博客文章,该应用程序可以在单个进程中运行以进行本地集成测试,但在部署时会将不同的子系统部署到 heroku 上的不同进程/dynos 中。

例如,我的 Web 应用程序中有用户管理、作业处理等服务。我想将它作为本地 Web 应用程序运行。但是,当我部署到 Heroku 时,我只想将无状态 Web 前端部署到两个测功机,然后让我可以选择不同的服务来运行工作测功机。我可能决定将其中 2 个服务分组到一个进程中,或者决定每个服务都应该在自己的进程中运行。显然,当服务在自己的进程中运行时,它们需要透明地添加某种传输,如 REST、RabbitMQ 或 AKKA 等。

有没有关于从哪里开始学习如何做到这一点的指示?或者我是否错误地思考了这个问题,而您想建议一种不同的方法?我需要弄清楚如何设置应用程序以及如何构建 maven 和 intellij 来实现此目的。

谢谢。

最佳答案

我无法向您指出预制的文章或帖子,但我可以分享我开始解决类似问题的方向。本质上,所提出的方法与您的方法类似 - 将具有可能长时间运行逻辑的特定服务放入工作动态中,并通过 RedisToGo 实例(Heroku 附加组件)上的 Jesque(Resque 的 Java 端口)传递消息。我从未完全解决单独的 Web 与 Worker Spring 上下文(转移到其他优先事项),但其要点是 1) Web 层应用程序上下文将配置为发布消息,2) Worker 应用程序上下文配置为使用。

也就是说,我在本地使用 foreman 来模拟 Heroku 环境来调试缩放(foreman start --formation="web=2" + Apache mod_proxy_http)。当您扩展到 2 个以上 dyno 时,Spring 会遇到大问题 - 确保在使用 webapp-runner 时使用 Redis 或 Memcache 进行 session 存储。 Spring 默认使用 HttpSession 来存储安全上下文...没有 session 关联或 native Tomcat session 复制。

最后的警告 - 在我们的例子中,我们的工作进程不需要反射(reflect)给最终用户。也就是说,我们将 Pusher 用于其他功能(也是 Heroku 插件)。如果您需要在异步任务完成时更新用户,我建议您查看它。

关于java - 在 Heroku 上扩展 Spring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16376129/

相关文章:

java - Java将int转换为时间

java - 如何在java上处理非常大的数字的计算?

java - Spring Boot-如何通过实现BeforeAllCallback的自定义扩展类设置或覆盖application.yml中定义的属性?

java - PoolingHttpClientConnectionManager 不释放连接

maven - 启动 svn blame 时 SonarQube 出错

java - 使用 mvn 命令构建 Scala 项目

java - 如何检索以逗号作为分隔符的空格行?

java - 摩尔斯电码,从英语到摩尔斯电码

java - Spring:委托(delegate)给自定义代理包装器进行接口(interface)注入(inject)

java - 无法解决 Maven 多模块项目中的依赖关系