在hypnotoad下使用Mojo :: Pg :: Pubsub

时间:2016-04-07 09:47:54

标签: postgresql mojolicious hypnotoad

我在Pg数据库中有一个带有令牌的表,并且没有使用永久SELECT来重载DB我决定使用几个简单的mojo助手(用于检查令牌有效,删除和添加令牌到这样的缓存)来缓存RAM中的令牌应用

我使用Mojo :: Pg :: Pubsub和Pg通知系统(我有一个触发器通知令牌插入/删除)来捕获DB中删除/创建令牌的事件。 所有工作人员都在他们的ioloops中安排了sub,以便在DB中使令牌无效的令牌上进行SQL DELETE。通过Pg通知机制,当所有催眠工作者在内存中拥有相同的令牌池时,我需要得到一个情况,因为他们都通知了任何更改。

但是存在一个问题,即只有1个催眠工作者(来自池中的随机工作者,每次不同的工作者)捕获此事件。据我所知,Mojo :: Pg对象可能变得重复,而工人是叉子。我还发现Mojo :: Server :: Prefork包含在mojo应用程序的引擎盖下,并且发出了一个名为“spawn”的事件。在文档中注明,如

'Emitted when a worker process is spawned.'

我认为可以接受的解决方案是订阅此事件并为每个新的分叉工作者重新创建Mojo :: Pg对象,但我找不到可以访问服务器对象来订阅此事件的方法。

我该怎么办?或者我可能只是做错了,还有其他方法可以解决上述问题吗?

以下是我的mojo app中用于处理DB的代码:

my $pg = connect_mojo($app->config, $app->mode);
$app->helper(pg => sub {
    return $pg;
});

$app->helper(db => sub {
    return $app->pg->db;
});

以下是负责从Pg中捕获通知的代码:

# Postgres notifies about token deletion through it's notification system
$app->pg->pubsub->listen(token_deleted => sub {
    my ($this, $token) = @_;
    $app->log->info("Notification for deleting token from Pg received: $token");
    $app->token_mem->invalidate($token);
});

# Postgres notifies about token creation through it's notification system
$app->pg->pubsub->listen(token_created => sub {
    my ($this, $token) = @_;
    $app->log->info("Notification for adding token from Pg received: $token");
    $app->token_mem->add($token);
});

0 个答案:

没有答案