一对一的消息传递

Ably One-to-One Messaging

所以我试图在 NextJS 中使用 Ably 实现一对一消息传递,但我无法完成它。

我在为交互创建渠道(例如私人:-)和为用户创建渠道(例如私人:)之间陷入困境.

在第二个实现中,我只需要订阅他们的频道,但允许其他用户发布到私人频道:

总结:在 NextJS 中使用 Ably Realtime 实现一对一消息传递的最佳方式是什么

const {data: session, status} = useSession()
    let inputBox = null;
    let messageEnd = null;
    const [time, setTime] = useState("")

    const [messageText, setMessageText] = useState("");
    const [receivedMessages, setMessages] = useState([]);
    const messageTextIsEmpty = messageText.trim().length === 0;
    useEffect(()=>{
        console.log(session);
    }, [session])
    
    if(status === "authenticated"){
        console.log(session.id);
        const [channel, ably] = useChannel(`chat:${session.id}`, (message) =>{
            console.log(message);
        })
    }  

我试过了,但很快意识到 React Hooks 的规则使它不可能

抱歉,这是我第一次在 Stack Overflow 发帖

我是 Ably 的一名开发者倡导者。这在很大程度上取决于您希望在 user-to-user 聊天中执行的操作类型、您对频道数量的限制以及每个用户可以同时进行的聊天数。

最合乎逻辑的方法是为每个 1 对 1 聊天设置一个频道(因此 chat:user1:user2),因为这可以保证您拥有:

  • 2
  • 之间的消息顺序一致
  • 获取历史记录或任何一次对话很容易,因为它可以通过单个聊天请求获得。通常,将聊天作为频道进行逻辑划分可以使您想对聊天进行的任何处理变得简单

但是,如果您打算让每个用户订阅每个一对一聊天的事件,并且每个用户可能有大量潜在的一对一聊天,您可以开始点击几个问题:

  • 如果您假设每个用户平均进行 50 次一对一聊天,那么随着越来越多的用户加入聊天,这个数字会迅速增加
  • 如果任何用户都可以在您的平台上向任何其他用户发送消息,并且可能有成千上万的用户,您需要一种方法让客户知道订阅哪些渠道来接收消息。然后,这就变成了一个完整的考验,因为要生成元信息以确定哪些频道处于活动状态,他们应该订阅哪些频道,以及何时取消订阅频道以避免过度使用频道

一旦你想要那种规模,可能值得考虑拥有一个用户频道,其他用户可以在其中发布以与他们交流(比如 chat:user1)。如果说所有其他用户都被授予 publish-only 权限以使用 chat:* 一般命名空间,但授予他们聊天所需的所有权限 (chat:user1),那么您可以允许任何用户向任何其他用户发送消息他们无法查看其他人向该用户发送的消息。

  • 通常就频道数量而言,这很有用,因为 1 对 1 对话的频道数量上限为活跃用户总数
  • 确保任何 1 位用户订阅他们应该订阅的所有频道很容易,因为他们只需要订阅自己的频道

这里的问题是您随后需要创建一些功能来重现通常固有的 Ably 功能,例如获取对话历史记录。由于您无权访问其他用户的聊天频道,因此您需要一些方法来使您发送的消息对您自己可用。

这里的建议真正归结为您自己的聊天需求。如果它是临时的,您可能只需将其存储在本地即可。如果您已经在某个服务器上存储了 longer-term 历史记录,您可以将其用于一般历史记录请求。如果你需要它在 Ably 中可用,你也可以有一个单独的频道(比如 chat:user1:my_sent_messages),你也可以将你的消息发送到它作为所有的临时存储。问题是您最终可能会在接收客户端和发送客户端之间出现脱节的历史排序,但在考虑这些潜在解决方案时需要权衡这一点。

总的来说,如果您打算扩大规模,我可能会建议拥有 per-user 每个人都可以发布的渠道来与他们交流,但您可以根据自己的具体需求进行用途合并。