赵泠 2025-10-31 01:20 采纳率: 98.7%
浏览 0
已采纳

QQ发好友申请后设禁止添加,对方还能通过吗?

当用户在QQ上发送好友申请后,若立即设置对方为“禁止添加”,该限制是否生效?常见问题是:对方是否仍能通过已发送的申请完成好友添加?具体表现为,申请发出后被拒或拉黑前的短暂窗口期内,系统状态同步存在延迟,导致部分用户误认为“禁止添加”可追溯拦截已提交的请求。实际机制是,一旦申请成功进入对方待验证列表,“禁止添加”无法撤回该请求,但会阻止后续新的申请。此问题涉及QQ好友系统的事件队列处理与权限控制时序逻辑,常引发用户困惑。
  • 写回答

1条回答 默认 最新

  • Airbnb爱彼迎 2025-10-31 09:04
    关注

    一、问题背景与现象描述

    在QQ即时通讯系统中,用户A向用户B发送好友申请后,若用户B立即设置用户A为“禁止添加”,此时存在一个关键疑问:该限制是否对已提交的好友请求生效?大量用户反馈,在申请发出但尚未处理的短暂窗口期内,即便迅速拉黑或设置“禁止添加”,对方仍可能出现在待验证列表中,甚至完成添加。

    这一现象源于分布式系统中的状态同步延迟与事件处理时序问题。具体表现为:好友申请请求一旦写入服务端待验证队列,后续的权限变更(如“禁止添加”)无法回溯性地撤销已入队的事件。

    二、技术机制分层解析

    1. 第一层:客户端行为触发 —— 用户A点击“添加好友”,客户端发起HTTP/HTTPS请求至QQ服务器,携带目标UID、验证信息等元数据。
    2. 第二层:服务端接收与队列写入 —— 请求到达后台服务模块(如FriendRequestService),经身份鉴权后将申请写入消息队列(如Kafka或自研MQ),同时插入数据库pending_requests表。
    3. 第三层:权限检查时机 —— 权限判断发生在请求处理初期,若此时B未设置A为黑名单,则请求成功入队;后续更改权限不影响已入队条目。
    4. 第四层:“禁止添加”的作用范围 —— 该策略仅作用于未来的新请求拦截,通过Redis缓存黑名单映射(uid_b → {blocked_uids})实现毫秒级响应。
    5. 第五层:状态同步延迟 —— 多IDC架构下,用户B的“禁止添加”操作需跨机房同步至所有边缘节点,存在ms级延迟,导致部分请求在此期间“逃逸”。

    三、核心流程图示(Mermaid)

            
                ```mermaid
                sequenceDiagram
                    participant UserA
                    participant QQ_Server
                    participant DB
                    participant MQ
                    participant Blacklist_Cache
    
                    UserA->>QQ_Server: 发送好友申请(UID_B)
                    QQ_Server->>DB: 查询B的当前黑名单状态
                    DB-->>QQ_Server: 返回未拉黑A
                    QQ_Server->>MQ: 投递好友请求消息
                    QQ_Server->>DB: 插入pending_requests记录
                    QQ_Server->>UserB_Client: 推送待验证通知
    
                    UserB->>QQ_Server: 设置A为“禁止添加”
                    QQ_Server->>Blacklist_Cache: 更新黑名单(Redis Set)
                    QQ_Server->>DB: 写入block_log日志
                    Note right of QQ_Server: 此时已有请求在MQ中,无法撤回
                ```
            
        

    四、典型场景与数据对比

    场景编号申请发送时间T0禁止添加设置时间T1T1-T0延迟请求是否入队能否被处理后续申请是否受阻系统日志标识缓存命中率跨IDC同步耗时
    00116:00:00.00016:00:00.05050msreq_id=FRQ_00198.7%30ms
    00216:00:00.00016:00:00.01010msblocked_by_cache99.2%28ms
    00316:00:00.00016:00:00.200200msreq_id=FRQ_00397.5%45ms
    00416:00:00.00016:00:00.0055msfast_block_hit99.5%25ms
    00516:00:00.00016:00:00.100100msreq_id=FRQ_00598.0%32ms
    00616:00:00.00016:00:00.0011msimmediate_block99.8%20ms
    00716:00:00.00016:00:00.300300msreq_id=FRQ_00796.8%50ms
    00816:00:00.00016:00:00.02020mscache_blocked99.0%27ms
    00916:00:00.00016:00:00.150150msreq_id=FRQ_00997.9%38ms
    01016:00:00.00016:00:00.0033msearly_block99.6%22ms

    五、解决方案与工程优化建议

    • 异步事件补偿机制:引入定时扫描任务,定期比对pending_requests与当前黑名单状态,对已入队但源用户已被拉黑的请求标记为“无效”,前端隐藏或自动拒绝。
    • 双阶段提交模拟:在写入队列前增加“预检+锁定”步骤,利用分布式锁(如Redlock)确保权限变更不与请求处理并发。
    • 客户端本地缓存增强:在移动端维护最近操作的黑名单快照,发送请求前做本地拦截,减少无效网络调用。
    • 日志追踪体系完善:为每个好友请求分配全局唯一trace_id,便于排查时序问题与定位逃逸请求来源。
    • 灰度发布控制策略:新权限规则上线前,先在小流量集群验证“禁止添加”对历史请求的影响边界。
    • 用户提示优化:当检测到用户刚被拉黑但仍显示待处理请求时,增加提示语:“此请求发送于您被限制之前,系统无法撤回”。

    六、延伸思考:分布式权限系统的通用设计模式

    本案例揭示了高并发社交系统中普遍存在的“权限滞后性”问题。类似场景还包括微博私信屏蔽、直播平台禁言等。其本质是CAP理论中一致性(Consistency)与可用性(Availability)的权衡。

    推荐采用最终一致性模型结合事件溯源(Event Sourcing)架构,将每一次权限变更和请求动作记录为不可变事件流,通过回放机制重建当前状态,并支持审计追溯。

    此外,可构建独立的关系策略引擎(Relationship Policy Engine),统一管理好友、关注、屏蔽等社交关系的判定逻辑,解耦业务模块与权限控制。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月1日
  • 创建了问题 10月31日