我想使用WebSockets广播用户通知,并使用PostgreSQL NOTIFY语法发送它们。
我还想避免在解决方案中引入另一个服务器,无论是Redis、RabbitMQ等。
这可行吗?PostgreSQL中的异步LISTEN是否存在问题
像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,然后进入事务很长一段时间,则无法进行清理。