如何在 golang 中“同步”切片和映射?

问题描述 投票:0回答:1

我正在制作一个将由另一个程序使用的 API,当 API 对用户进行身份验证时,它会为其提供一个 ID。然后使用该 ID 连接到网络套接字。 当 API 最初将 ID 发送给用户时,它会将其添加到一个切片中,这是为了确保用户不能仅使用一组凭据同时进行两个会话。 一旦用户连接到网络套接字,ID 就会被发送并添加到包含连接和 ID 的地图中。 当连接关闭时,ID 将从切片中删除并且连接:ID 对从地图中删除。

问题是,如果身份验证请求完成,但 web 套接字连接没有&客户端程序关闭,用户将被锁定在程序之外,因为 ID 将在切片中。 有没有办法将切片与映射同步,这样如果程序无法连接到网络套接字,当他们尝试重新运行程序时就不会被锁定?

authentication go websocket api-design
1个回答
1
投票

您不需要“同步地图和切片的方法”;您需要一种方法来防止您描述的锁定情况。

  1. 听起来您不需要单独的地图和切片开始;你可以单独使用地图,如果它们已连接,则包含一个包含连接的字段,如果连接仍未决,则为零。

  2. 授权完成,下发ID后,将当前时间戳和ID一起存入地图

  3. 在授权时,如果您发现一条记录已经超过几分钟(或者您认为授权和连接之间的合理超时时间是多长)并且没有活动连接,请将其删除,就像它从未存在过一样, 并创建一个新的。这样你就没有“锁定”条件。

  4. 还有一个定期运行并从地图中删除陈旧条目的任务(这可以防止它随着时间的推移从授权一次、从未连接和从未重试的用户那里积累数百万个条目)。

© www.soinside.com 2019 - 2024. All rights reserved.