gpt4 book ai didi

tarantool - 如何在 tarantool 墨盒中执行热重载代码?

转载 作者:行者123 更新时间:2023-12-04 00:54:15 24 4
gpt4 key购买 nike

如何在不重新启动应用程序的情况下在 tarantool cartridge 中执行热重载代码?

最佳答案

为了找到问题的最佳解决方案,了解您要实现的目标非常重要。有 2 种可能的情况:

  • 您使用包管理器重新部署您的应用,并且需要从文件系统重新加载代码
  • 您想通过网络通过数据库 API 推送新代码

第一个可以通过卸载模块并再次加载来完成。所有模块在加载时都会将自己放入“package.loaded”表中。所以你只需要更新它:

package.loaded['mymodule'] = nil
require('mymodule')

这是一种您可以概括的低级方法:遍历“package.loaded”的内容,卸载所有内容并重新加载。您需要注意不要卸载文件系统中不存在的模块。有一个模块可以帮助您解决这个问题:https://github.com/moonlibs/package-reload

虽然该模块将帮助您了解基础知识,但您还需要考虑其他事项。在 Lua 中很容易在全局对象中存储函数指针。如果您重新加载函数本身,您将不会神奇地更新所有具有指向旧函数的指针的地方。例如,让我们考虑 http 服务器:

-- in mymodule.lua
local function handler(req)
local resp = req:render({text = req.method..' '..req.path })
resp.headers['x-test-header'] = 'test';
resp.status = 201
return resp
end

-- somewhere else
router:route({ path = '/test', method = 'GET' }, mymodule.handler)

如果你重新加载 mymodule.lua,而不是再次调用 router:route 来重新注册处理程序,HTTP 请求仍然会调用旧函数。

在 cartridge 中,您通常在 apply_config() 或 init() 中注册函数。参见 here例如。为了重新注册回调,您需要再次调用角色的 init() 或 apply_config() 。要获取角色列表,您可以使用 cartridge.roles.get_known_roles() .您需要遍历它们并重新初始化它们。

为了调用重新加载代码的函数,您需要通过二进制协议(protocol)进行连接,或者使用管理套接字。管理套接字允许您为此编写一个简单的 shell 脚本。你可以通过查看 tarantool_is_up script 来了解这个想法。 .它展示了您可以针对您的用例进行调整的方法。

实现此目的的第二种方法是使用 cartridge-extensions这使您可以通过网络推送新代码。它已经具有一些优点,例如简化了与公共(public)端点的绑定(bind)。

关于tarantool - 如何在 tarantool 墨盒中执行热重载代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63902540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com