使用PostgreSQL通知来避免使项目基础结构复杂化



我想使用WebSockets广播用户通知,并使用PostgreSQL NOTIFY语法发送它们。

我还想避免在解决方案中引入另一个服务器,无论是Redis、RabbitMQ等。

这可行吗?PostgreSQL中的异步LISTEN是否存在问题

是的,这是可行的。postgresqlNOTIFY/LISTEN功能允许有效地通知客户端,因为客户端不必定期轮询表中的更改或类似内容。相反,用epoll/poll/select(用于读取准备(注册DB连接的文件描述符就足够了,这样进程就可以休眠到下一个通知,以防没有更好的事情可做。

像psycopg这样的软件包是在幕后完成这项工作的。最小psycopg3示例:

import psycopg
db = psycopg.connect('dbname=somedb ...', autocommit=True)
db.execute('LISTEN testchannel')
xs = db.notifies()
for x in xs:
    print(x)

有效负载大小和服务器端缓冲有一些技术限制,但在实践中似乎很难超过这些限制。有关详细信息,请参阅postgresql文档:

payload[..]在默认配置中,它必须小于8000字节。(如果需要传输二进制数据或大量信息,最好将其放在数据库表中,并发送记录的密钥。(

有一个队列,其中包含已发送但尚未由所有侦听会话处理的通知。如果此队列已满,则调用NOTIFY的事务将在提交时失败。队列相当大(在标准安装中为8GB(,大小应该足以满足几乎所有用例的需要。但是,如果会话执行LISTEN,然后进入事务很长一段时间,则无法进行清理。

相关内容

  • 没有找到相关文章

最新更新