当前位置: 首页 > 面试题库 >

没有插件就可以在Heroku上进行Redis吗?

毋琪
2023-03-14
问题内容

我正在研究将Heroku用于使用Redis的PHP应用程序。我看过各种Redis插件。例如,使用Redis To Go,您可以在PHP代码中使用$ _ENV
[‘REDISTOGO_URL’]环境变量作为Redis Server的URL。

这些附加组件中的大多数都有自己的定价方案,我希望避免这种做法。我对heroku的工作方式有些困惑。有没有一种方法可以直接在没有插件的Dynos上安装Redis?

例如,是否有一个工人dyno充当服务器,另一个工人dyno充当客户端?如果可能,我将如何处理:

  1. 在Dyno上安装并运行redis服务器?这与在任何其他Unix盒上安装相同吗?我可以直接安装并安装我想要的东西吗?

  2. 是否有一个Dyno通过TCP通过IP /端口连接到另一个?工人dynos是否有我可以使用的自己的可引用IP地址或命名URL?我可以以某种方式从PHP动态获取它们吗?

Redis客户端的php代码假定存在可以连接的主机和端口,但不知道它将是什么?

$redis = new Predis\Client(array(
        "scheme" => "tcp",
        "host" => $host, //how do i get the host/port of a dyno? 
        "port" => $port));

问题答案:

在dyno上运行redis是一个有趣的想法。您可能需要创建一个redis
buildpack,以便您的dynos可以下载并运行redis。由于“
redis除了可以正常运行的GCC编译器和libc外没有其他依赖项”,
从技术上讲应该是可能的。

但是,这可能会遇到一些问题:

  1. Heroku dynos没有静态IP地址


dynos没有静态IP地址..您永远无法通过IP直接访问dyno”

即使您在dyno上设置并运行Redis,我也无法找到一种定位该dyno实例并将其发送给redis请求的方法。这意味着您的Redis服务器可能必须与Web服务器/主应用程序在相同的dyno上运行。

意味着,如果您尝试通过创建更多的Web
dynos来扩展应用程序,则还将创建更多的本地redis实例。它们之间将不会共享数据。这并不是一个特别可扩展的设计,但是如果您的应用足够小,只需要一次网络测功就可以了。

  1. Heroku dynos具有临时文件系统

“任何其他dyno中的进程都看不到已写入的文件,并且在dyno停止或重新启动时,所有写入的文件将被丢弃”

默认情况下,Redis将其RDB文件和AOF日志写入磁盘。您需要定期将这些备份到某个位置,以便在dyno重新启动后进行获取和还原。请参阅有关Redis持久性的文档。

  1. Heroku测功机经常重启


Dynos每天至少循环一次,或者每当dyno歧管检测到底层硬件中的故障时,都要进行循环。”

每次dyno启动时,您将需要能够启动您的Redis服务器并还原数据。

  1. Heroku dynos具有512MB RAM

“每个dyno分配了512MB的内存以在其中运行”

如果您的Redis服务器与Web服务器在同一台dyno上运行,请减去主应用程序所需的RAM。您需要多少Redis内存?

以下是一些尝试估计和跟踪Redis内存使用的问题:

* [Redis:数据库大小与内存之比?](https://stackoverflow.com/questions/4731873/redis-database-size-to-memory-ratio)
* [分析Redis内存使用情况](https://stackoverflow.com/questions/5532701/profiling-redis-memory-usage)

--

总体: 我建议阅读12个因子应用程序,以进一步了解heroku的预期应用程序模型。

简短的版本是,dynos旨在成为可以轻松创建和丢弃以满足需求的独立工作者,并且dynos访问各种资源以读取或写入数据并为您的应用服务。Redis实例是资源的示例。从上面的项目中可以看到,通过使用Redis附加组件,您将获得可以保证是静态,稳定和可访问的内容。

阅读材料:

  1. http://www.12factor.net/-特别是流程和服务
  2. Heroku过程模型
  3. Heroku博客-过程模型


 类似资料:
  • 我已经将我的maven构建项目转换为gradle,现在我们在maven中使用的一个插件是SQLj插件。sqlj插件有额外的配置。sqlj)文件,然后将它们编译到。java和。服务特定目标目录。 我不确定在gradle版本中配置这个。你能帮助我如何在build.gradle文件中写这个配置吗? 我只包含了从mvcentral得到的与gradle等价的依赖线。 // https://mvnreposi

  • 问题内容: 我有一个用CoffeeScript编写的node.js应用程序。 我想知道在Heroku上托管应用程序需要什么。 谢谢 问题答案: 由于Heroku的更新,它现在允许安装源。以下答案是Heroku完全支持之前的一种变通方法。对于目前更好的解决方案,请参阅更高的额定回答解释了如何简单地使用从在Heroku。 老实说,最好的方法是像Peter所建议的那样事先使用它进行编译,但是我不知道您是

  • 在当地没有问题。 该应用程序已部署到heroku,但我收到一个错误屏幕。在我得到的日志中: heroku[router]:at=error code=H14 desc=“没有正在运行的web进程”method=GET path=“/”host=catan manager api。希罗库普。com request_id=c68d7131-7572-4fe6-ae9d-13836519e25c fwd

  • 我试图在heroku中部署我的应用程序,但当我最终尝试在heroku中运行我的应用程序时,我在浏览器中看到了这个: 当我看到我的日志时,我会看到下一个:

  • 我目前正在开发一个部署在heroku中的Spring Boot应用程序。该应用程序在同一回购协议上有两个主要项目(前端和后端)。我设法用node运行了前端。js和(技术上)也成功地运行了spring boot应用程序。 根据日志,一切似乎都正常,但当我访问应用程序时,它返回一个HTTP 500,声称没有运行Web进程。 但当我和heroku ps联系时 这是我的文件: 它声明两个进程(一个用于前端

  • 我试图部署一个maven java应用程序在heroku使用eclipse JEE。但当我运行我得到了这个错误 [错误]在当前项目和插件组[org.apache.maven.plugins,org.codehaus.mojo]中没有找到前缀heroku的插件[本地(C:\用户\menna. m2\repository),中央(https://repo.maven.apache.org/maven2