所以我试图用Ably在NextJS中实现一对一消息传递,但我没能完成。
我被困在为交互创建频道(例如,私人频道:<user_1>-<user _2>(和为用户创建频道(如私人频道:<user_1>(之间。
在第二个实现中,我只需要订阅<user_1>到他们的频道,但允许其他用户发布到私有:<user_1>。
摘要:在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的开发者倡导者。这在很大程度上取决于你希望在用户对用户聊天中执行什么样的操作,你对频道数量的限制,以及每个用户有多少并发聊天。
最合乎逻辑的方法是为每个1对1的聊天都有一个单独的通道(所以chat:user1:user2(,因为这保证了你有:
- 两个
- 获取历史记录或任何一次对话都很容易,因为它可以通过一个聊天请求获得。一般来说,聊天作为渠道的逻辑划分使你想对聊天进行的任何处理都变得简单
然而,如果你打算让每个用户都订阅每个1对1聊天的事件,并且每个用户都可能有大量潜在的1对1聊,你可能会开始遇到一些问题:
- 如果你对每个用户平均50次1对1的聊天有发言权,那么随着越来越多的用户加入聊天,这一数字会迅速增加
- 如果任何用户都可以在你的平台上向任何其他用户发送消息,并且可能有数千或数百万用户,你需要一种方法让客户知道订阅哪些渠道来接收消息。然后,这就变成了一场折磨,因为要生成元信息来确定哪些频道是活动的,他们应该订阅哪些频道,以及何时取消订阅以避免过度使用频道
一旦你想要这样的规模,可能值得考虑拥有一个其他用户发布的用户频道来与他们交流(比如chat:user1(。如果说所有其他用户都被授予了使用chat:*命名空间的仅发布权限,但被授予了他们聊天所需的所有权限(chat:user1(,那么你可以允许任何用户向任何其他用户发送消息,而他们无法查看其他人向该用户发送的消息。
- 一般来说,就频道数量而言,这很有帮助,因为1对1对话的频道数量上限为活动用户的总数
- 很容易确保任何一个用户都订阅了他们应该订阅的所有频道,因为他们只需要订阅自己的频道
这里的问题是,您需要创建一些功能来复制通常固有的Ably功能,例如获取对话历史记录。由于你无法访问其他用户的聊天频道,你需要一些方法来让你发送的消息对自己可用。
这就是建议真正归结为你们自己聊天需求的地方。如果它是短暂的,你可能只需要在本地存储它就可以了。如果您已经在某个服务器上存储了长期历史记录,那么您可以将其用于一般历史记录请求。如果你需要在Ably中提供它,你也可以有一个单独的频道(比如chat:user1:my_sent_messages(,你还可以将消息发送到该频道,作为所有信息的临时存储。问题是,接收和发送客户端之间的历史排序可能会脱节,但在考虑这些潜在的解决方案时,这需要权衡。
总的来说,如果你打算扩大规模,我可能建议每个人都发布每个用户的频道来与他们沟通,但你可以根据自己的具体需求进行用途合并。