gpt4 book ai didi

next.js - 一对一的消息传递

转载 作者:行者123 更新时间:2023-12-05 04:32:36 24 4
gpt4 key购买 nike

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

我在为交互创建 channel (例如私有(private): - )和为用户创建 channel (例如私有(private): )之间陷入困境。

在第二个实现中,我只需要订阅 到他们的 channel ,但允许其他用户发布到私有(private):

总结:在 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 的一名开发者倡导者。这在很大程度上取决于您希望在用户间聊天中执行的操作类型、您对 channel 数量的限制以及每个用户可以同时进行的聊天数。

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

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

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

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

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

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

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

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

总的来说,如果您打算扩大规模,我可能会建议拥有每个用户发布的 channel 以与他们沟通,但您可以根据您的特定需求合并使用。

关于next.js - 一对一的消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71621802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com