关系连接

关系连接

我看到很多 charms 都同时带有relation-changedrelation-joined钩子来表示它们之间的关系。有时两个钩子甚至是同一个文件,其中一个是另一个的符号链接。然而,juju 文档relation-joined relation-changed当关系连接时,钩子就会运行。

我的护身符应该只包括一个钩子还是另一个钩子,而不是两个都包括吗?

答案1

这取决于 charm 的用例。以下是思考每个关系钩子的作用及其执行时间的好方法:

关系连接

这始终是第一个被执行的钩子,它也只被执行一次在特定服务与服务关系的生命周期内。现在可以保证两个服务中的哪一个钩子将首先触发,但它始终是关系钩子集合中第一个触发的。许多 charms 不需要这个,但有些 charms 这一点非常重要。如果您有任何需要首先执行的设置详细信息,那么它们将在这里发生。以数据库服务器为例:大多数数据库服务器 charms 使用钩子relation-joined来创建数据库、用户、密码和其他服务将等待的详细信息。它可以在挂钩期间执行此操作relation-changed,但这会增加更多的复杂性,以确保它不会一遍又一遍地重新创建数据库和用户(更多关于为什么会在一秒钟内发生这种情况的信息)。

关系改变

成功relation-joined执行后,该钩子会立即运行一次。然后,每次在服务之间通过线路发送数据时,都会再次执行此钩子。因此,它确实需要幂等,因为它可能会执行多次。因此,许多 charms 会收集预期的relation-get数据并确保它存在,然后再继续。至于为什么relation-joinedANDrelation-changed钩子在连接事件上相继触发,可能是为了便于使用,而不需要relation-joined明确使用钩子。

至于你的 charm 应该包含什么,这完全取决于你和你的 charm 的用例。并不是每个 charm 都有一个relation-joined,事实上考虑到商店的大小,很少有人有 。它实际上只在明确需要做某事时使用只有一次在该关系的生命周期内。为了清楚起见,当我说“仅一次”时,我指的是执行juju add-relation。如果您将另一个关系添加到另一个服务,则relation-joined钩子和整个生命周期将重新开始。(因为理论上您可以将多个服务连接到一个服务上的一个关系)

相关内容