热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

微信的离线交互逻辑

1.微信的一个原则微信做产品的一个原则:核心功能做到极致,辅助功能尽量做到降低成本。2.搜索功能聊天页面的“搜索”功能的使用场景频次由高到低是ÿ
1. 微信的一个原则

微信做产品的一个原则:核心功能做到极致,辅助功能尽量做到降低成本。




2. 搜索功能

聊天页面的“搜索”功能的使用场景频次由高到低是:微信好友、群聊好友、公众号&小程序、聊天记录、收藏。而由于用户在搜索信息呈现的页面下滑到“聊天记录”这个功能且通过“搜索”来查找聊天记录的场景比较少,频次比较低,所以在“聊天记录”这个功能之前,微信机智地插入了自己的广告:功能、游戏。




3. 聊天功能

而“语音输入”功能,则是因为用户对着微信说话,微信将语音转化成文字,属于用户与用户强关系社交下的即时通讯辅助。这时候对于用户来讲,他希望可以即时被告知“语音输入”功能是否能用,如果在用户不明确网络是否可行的前提下,用户点击了“语音输入”,等用户语音录入完毕、希望传达信息的时候,微信loading(加载)页反馈需要等待,或者提示网络不可用,这种体验对于用户来说是很伤的。

所以,微信将这三个功能(视频聊天、实时共享位置、语音输入)设置成在用户使用前就即时判断是否有网。




此外需要注意的是,发红包和转账因为涉及到余额或者从银行卡支取钱,所以必须请求服务器才能完成。因此操作进行到支付环节的时候,因为需要请求服务器,导致这时候在离线情况下,流程将不能如常进行下去。

那么这里面有一个问题:既然知道支付环节要联网才能走完整个流程,为什么不在整个流程之初(点击“红包”、“转账”)的时候就直接出现“当前网络不可用”之类的弹屏提示呢?

对此,我是这么认为的:

  • 第一,如果用户使用场景是一直处于离线状态,那么这个时候,用户通常不会使用微信等APP;
  • 第二,弱网环境或者网络不稳定的环境,要比离线环境的使用场景多,如果在流程之初(点击“红包”、“转账”),就需要请求服务器,告知“网络不可用”,那么用户很容易直接放弃该操作;
  • 第三,这么做可以减少前端对服务器的请求次数,对于月活近十亿级用户的微信来说,减少对服务器的一次请求,在服务器端的支出都有可能降低很多。我想这第三点也应该是里面最重要的一点。






4. 好友

对于微信的好友处理的相关操作,我发现微信的原则是:尽最大可能地减少对服务器的请求。

结合前面的情况以及流程的分析,我认为在微信的服务器端,微信并没有对用户的聊天内容进行储存,只是将其作为一个信息传递的通道。对此,我们可以这样理解,我们发送的消息就像货物一样,被服务器由A站拉到B站然后卸载下来后,服务器就不管了,如果B站收了就收了,如果B站不收,也并不会把货物(聊天内容)让服务器带回去储存在服务器或者返回给A站




5. 设置

涉及到账号安全的功能模块,在离线状态下都是没有办法使用的,这是因为账号安全的相关处理,放在后端要比前端安全的多,所以不只是微信,其他平台也是这样,即选择通过后台来处理和账号安全相关的问题,是比较普遍的做法。




一味追求逻辑正确是标准的技术思维,而一味追求用户体验,不考虑逻辑和技术又属于空谈。




6. 朋友圈

微信一共有三种loading(加载)机制:

  • loading过程中不能进行任何操作的,只能等提示网络超时;
  • loading过程中可以点击返回或者取消等操作,来停止loading;
  • loading和其他操作互不影响的。

而在朋友圈页面中loading的加载机制即为第三种:






对此我的分析是,朋友圈在使用频率上可以说仅次于即时通讯,一个小小的优化影响到十亿用户的高频使用,这时候弱网环境、断网环境的容错性就变得尤为重要。对于这样一个使用频率较高的功能,当用户在行驶的地铁上或者火车上等信号非常不稳定的场景下,还可以进行正常发朋友圈、点赞、评论、回复的操作体验,这样的设计就显得格外重要了。

而且,朋友圈相对即时通讯,其实是属于弱关系社交,天然的场景下是不需要对方马上做出回复、点赞、评论等互动。所以,这种逻辑可以说是保证在离线状态下可以使用该功能,且互动信息在有网环境下推送给对方这样符合用户使用场景的最优解决方案了。虽然这一点技术上实现起来应该是相当困难的,但是一旦实现价值也是显而易见的,通过微信朋友圈这个成功的产品就能明显看出来。




7. 总结




通过对离线版微信一些常见的功能以及对应操作的分析,我发现微信对于前后端交互处理的原则有以下几点:

  • 对于非核心功能,为了尽可能减少对服务器的压力,微信做了大量的前端缓存、前端交互逻辑;
  • 在不得不请求服务器时,微信会考虑该结果是用户即时想要的还是可以延后的,如果是即时想要的,就即时请求服务器(如支付),如果不是那么急迫,则有可能延后请求,以保证网络环境较差的时候,流程可以走通(如拉黑、删除);
  • 对于核心功能(如朋友圈),做到最大限度的容错性以保障用户体验。

另外,在这整个过程中,作为一枚产品狗,我得到了如下的一些启发,且这些信息可以应用到我的工作中,希望也可以对你有帮助:

  • 对于成本控制的意识,应该纳入产品方案中去,也许我们做不到像微信那么极致,但是有意识的往这方面考虑,也许会有更好的产品方案;
  • 对于核心功能花多大精力去优化,都不为过,因为这才是我们安身立命的根本;
  • 不要一味追求逻辑正确,可能有些时候逻辑合适才是更重要的。




出处:https://zhuanlan.zhihu.com/p/29129653




推荐阅读
  • 构建高性能Feed流系统的设计指南
    随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
  • 微信小程序支付官方参数小程序中代码后端发起支付代码支付回调官方参数文档地址:https:developers.weixin.qq.comminiprogramdeva ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • STM32代码编写STM32端不需要写关于连接MQTT服务器的代码,连接的工作交给ESP8266来做,STM32只需要通过串口接收和发送数据,间接的与服务器交互。串口三配置串口一已 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文深入探讨了分布式文件系统的核心概念及其在现代数据存储解决方案中的应用,特别是针对大规模数据处理的需求。文章不仅介绍了多种流行的分布式文件系统和NoSQL数据库,还提供了选择合适系统的指导原则。 ... [详细]
  • 本文探讨了六项Java特性,它们虽然强大,但在不当使用时可能会给应用程序带来严重问题。文章基于作者Nikita Salnikov Tarnovski多年的应用性能调优经验,提供了对这些特性的深入分析。 ... [详细]
  • 配置PicGo与Gitee结合Typora打造高效写作环境
    本文详细介绍了如何通过PicGo和Gitee搭建个人图床,并结合Typora实现高效的文章撰写。包括创建图床项目、生成访问令牌、安装配置PicGo和Typora等步骤。 ... [详细]
  • [编程题] LeetCode上的Dynamic Programming(动态规划)类型的题目
    继上次把backTracking的题目做了一下之后:backTracking,我把LeetCode的动态规划的题目又做了一下,还有几道比较难的Medium的题和Hard的题没做出来,后面会继续 ... [详细]
  • 深入浅出:Hadoop架构详解
    Hadoop作为大数据处理的核心技术,包含了一系列组件如HDFS(分布式文件系统)、YARN(资源管理框架)和MapReduce(并行计算模型)。本文将通过实例解析Hadoop的工作原理及其优势。 ... [详细]
  • 本文详细解析了Java中流的概念,特别是OutputStream和InputStream的区别,并通过实际案例介绍了如何实现Java对象的序列化。文章不仅解释了流的基本概念,还探讨了序列化的重要性和具体实现步骤。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 解决远程桌面连接时的身份验证错误问题
    本文介绍了如何解决在尝试远程访问服务器时遇到的身份验证错误,特别是当系统提示‘要求的函数不受支持’时的具体解决步骤。通过调整Windows注册表设置,您可以轻松解决这一常见问题。 ... [详细]
  • 本文深入探讨了微信小程序直播中点赞动画的实现方法,特别是如何利用三阶贝塞尔曲线使点赞图标沿预设路径移动,以及相关的数学计算与代码实现。 ... [详细]
  • 本文探讨为何Request对象的外观设计被认为是精妙的,重点在于其如何利用门面模式确保数据安全,同时保持系统的高效交互。 ... [详细]
author-avatar
520文雅_293
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有