即时通讯系统架构设计-如何设计一款WhatsApp

【IM开源推荐】前微信技术专家打造的开源的即时通讯组件OpenIM Open-IM是由前微信技术专家打造的***开源***的即时通讯组件。Open-IM包括IM服务端和客户端SDK,实现了高性能、轻量级、易扩展等重要特性。开发者通过集成Open-IM组件,并私有化部署服务端,可以将即时通讯、实时网络能力快速集成到自身应用中,并确保业务数据的安全性和私密性。 Open-IM包括哪些模块 (一)客户端 (1) golang实现的跨平台的SDK:Open-IM-SDK-Core ,开发者不需要关心 (2)在Open-IM-SDK-Core 基础上生成的iOS版本SDK:Open. 阅读详情
本文译自tech takshila经OpenIM技术人员整理修订后发布。
写在前面

Open-IM是由前微信技术专家打造的开源的即时通讯组件。Open-IM包括IM服务端和客户端SDK,实现了高性能、轻量级、易扩展等重要特性。开发者通过集成Open-IM组件,并私有化部署服务端,可以将即时通讯、实时网络能力快速集成到自身应用中,并确保业务数据的安全性和私密性。

了解更多原创文章:

【OpenIM原创】开源OpenIM:轻量、高效、实时、可靠、低成本的消息模型

【OpenIM原创】C/C++调用golang函数,golang回调C/C++函数

【OpenIM原创】简单轻松入门 一文讲解WebRTC实现1对1音视频通信原理

【OpenIM扩展】OpenIM服务发现和负载均衡golang插件:gRPC接入etcdv3

【开源OpenIM】高性能、可伸缩、易扩展的即时通讯架构

如果您有兴趣可以在文章结尾了解到更多关于我们的信息,期待着与您的交流合作。

免责声明:这是设计WhatsApp等即时通讯系统的一种方法。然而,我们不能保证WhatsApp是以这种方式设计的。这是我们设计类似系统的想法。

问题陈述

设计一个即时通讯平台,如WhatsApp或Signal,用户可以利用该平台相互发送消息。应用程序的一个重要方面是聊天信息不会永久存储在应用程序中。

*有趣的事实:*一些聊天信使(如FB Messenger)存储聊天信息,除非用户明确删除它。然而,像WhatsApp这样的即时通讯工具不会将消息永久保存在服务器上。

系统需求

instant messenger应用程序应满足以下要求。

  • 它应该能够支持用户之间的一对一对话。
  • 它应该能够向其他用户显示发送/交付/读取确认。
  • 它应该能够提供关于用户上次活动时间的信息。
  • 它应该允许用户共享图像。
  • 它应该能够向其他用户发送推送通知。

容量规划

我们需要建立一个高度可扩展的平台,能够支持WhatsApp规模的流量。此外,在进行容量规划时,我们需要确保考虑高峰流量的最坏情况。下面列出了我们可以用来估算应用程序容量的一些数字(如WhatsApp)。

-每月应用程序上的用户数:10亿

-高峰流量时每秒的活动用户数:650000

-高峰流量时每秒的邮件数:4000万

整个应用程序将由几个微服务组成,每个微服务执行特定的任务。处理聊天信息流量的数据平面(网站管理员包括到分布式系统章节的链接)(我们称之为chat microservice)中所需的服务器数量可以使用以下等式进行估计。

*#*𝑠𝑒𝑟𝑣𝑒𝑟𝑠 𝑖𝑛 𝑐ℎ𝑎𝑡 𝑚𝑖𝑐𝑟𝑜𝑠𝑒𝑟𝑣𝑖𝑐𝑒= (#聊天信息/秒)__∗ 延迟)/#每台服务器的并发连接

假设每台服务器的并发连接数为100K,发送消息的延迟为20毫秒。在这种情况下,聊天服务器机队中所需的服务器的估计数量(使用上述等式)将为8(即4000万*20毫秒/100K)。在标准实践中,建议再添加几个服务器,以处理这些服务器可能的故障。在接下来的一节中,我们将看到这些聊天服务器对总体基础设施成本的影响。

有趣的事实:在本次演讲中,Rick Reed(软件工程师@WhatsApp)谈到了优化基于Erlang的服务器应用程序,以及调整FreeBSD内核以支持每台服务器数百万个并发连接。这在很大程度上帮助了他们保持尽可能小的服务器占用空间。

高级设计

此即时通讯应用程序所需的功能可以使用两种微服务建模:聊天服务和临时服务。聊天服务将为活跃用户发送的在线聊天信息流量提供服务。该服务将检查接收消息的用户是否在线。如果用户在线,则消息将立即转发给该用户。否则,消息将由临时服务处理。此服务将负责维护发送给脱机用户的所有消息(文本或图像)。数据将暂时存储在临时存储器中,直到脱机用户恢复联机。我们将在后面的一节中提供有关各个组件的更多详细信息。

img

有趣的事实:WhatsApp实际上使用了一种非常类似的方法,正如同一位WhatsApp工程师(Rick Reed)在另一次演讲中所讨论的。

API设计

我们可以公开一个REST端点来与聊天服务交互。下面介绍了用于发送消息的API端点的定义。

sendMessage(String fromUser、String toUser、ClientMetaData ClientMetaData、String message)

请求:

_fromUser:\u发送请求的用户ID

_toUser:\u向其发送请求的用户ID

clientMetaData:用于存储客户端信息(如设备详细信息、位置等)的元数据。

消息:作为通信的一部分发送的消息。

数据模型

我们将存储详细信息,例如用户连接到的服务器以及用户上次活动的时间。我们可以使用基于文档的数据库(如MongoDB)来存储用户信息,如用户的最后活动时间(也称为心跳时间)。数据模型将类似于下表。

用户ID(香港)心跳时间已连接服务器

表1:数据模型-用户信息

组件图

在本节中,我们将讨论在一对一通信中发送消息的两种不同场景。之后,我们将讨论需要支持的其他功能,例如推送通知和用户活动状态。最后,我们将研究进行优化和处理故障场景的不同机制。

一对一通信

这里,我们将讨论与向另一个用户发送消息相关的两种不同场景。第一种情况涉及向在线用户发送文本消息。在第二个场景中,我们描述了向脱机用户发送图像所涉及的操作序列。

场景1:向在线用户发送文本

img

下面介绍了向在线用户发送文本消息的序列图中每个步骤的详细信息。

  • 步骤1:Alice向Bob发送一条消息,该消息被定向到Alice连接的聊天服务器。
  • 步骤2:Alice从其连接的聊天服务器(即聊天服务器A)获得确认,消息标记为Alice端发送。
  • 步骤3:聊天服务器向数据存储器发出请求,以获取有关Bob连接的聊天服务器的信息。
  • 步骤4:聊天室存储返回Bob连接到聊天室服务器的信息。
  • 步骤5:聊天室服务器A将消息转发给聊天室服务器B。
  • 步骤6:使用推送机制将消息传递给Bob。
  • 步骤7:Bob将ACK发送回聊天服务器。
  • 步骤8:ACK被转发到Alice连接的聊天服务器A。
  • 步骤9:ACK被传递给Alice,并被标记为已传递。
  • 步骤10:当Bob阅读消息时(假设15分钟后),另一个ACK被发送到Chat_Server_B。
  • 步骤11:聊天室服务器请求获取Alice连接的服务器。
  • 步骤12:聊天室存储返回Alice连接到聊天室服务器的信息。
  • 步骤13:聊天室服务器B将读取确认转发给聊天室服务器A。
  • 步骤14:将ACK转发给Alice,将请求标记为已读。

场景2:向脱机用户发送媒体文件

img

下面介绍了序列图中向脱机用户发送图像的每个步骤的详细信息。

  • 步骤1:Alice向Bob发送一个图像,该图像被转发到聊天服务器A,Alice与之连接的服务器。
  • 步骤2:聊天服务器将图像上传到文件服务器,文件存储在目录结构中
  • 步骤3:文件服务器将上传文件的图像url返回给聊天室服务器。
  • 步骤4:图像url返回给Alice,用于在Alice的设备上呈现图像。图像被标记为在Alice端发送。
  • 步骤5:聊天服务器向Bob连接的服务器发出请求。
  • 步骤6:聊天室存储返回Bob离线的信息。
  • 步骤7:聊天服务器将包含图像url的消息转发给临时服务器
  • 步骤8:临时服务器将包含图像url的消息存储在临时存储器中。
  • 第九步:Bob上线并与Chat_Server_B进行心跳(网站管理员包括链接)。
  • 步骤10:聊天服务器从临时服务器获取Bob的临时消息。
  • 步骤11:聊天服务器将临时消息转发给Bob。
  • 步骤12:Bob从文件服务器获取图像。此时,映像将被传送到Bob的设备,所有对瞬态消息的引用都将从系统中删除。
  • 步骤13:Bob的设备向聊天服务器发送Alice图像的确认
  • 步骤14:获取Alice连接到的服务器的信息;i、 e.聊天室服务器
  • 步骤15:将确认转发至聊天室服务器
  • 步骤16:将ACK传递给Alice,将消息标记为已传递。

瞬态数据存储

我们可以使用基于FIFO的策略实现基于队列的机制来存储和检索瞬态消息。为此,我们可以使用现有的基于云的技术,如AmazonSQS或WindowsAzure队列服务。我们可以使用这些队列来存储发送给脱机用户的临时消息。一旦消息传递给脱机用户,所有对这些临时消息的引用都将从系统中删除。

推送通知

使用推送技术向用户传递消息有两种方法:客户端推送或服务器推送。如果我们沿着客户机请求的路线走下去,我们可以在长轮询和短轮询之间做出决定。另一方面,有两种方法可以实现服务器推送方法:WebSocket和服务器发送事件(SSE)。Websockets已经成为聊天应用程序事实上的通信协议。我们在下面的部分中提供了有关它的更多详细信息。

使用轮询技术,客户机定期向服务器请求新数据。选择轮询技术的权衡决定可以使用下面提到的数据点。

  • 短轮询:(例如,基于AJAX的计时器)
  • *优点:*如果请求之间的时间间隔较长,则更简单且不太消耗服务器
  • 缺点:不适用于需要以最小延迟通知服务器事件的情况
  • 长轮询:(例如,基于XHR的Comet)
  • *优点:*服务器事件的通知不会延迟
  • *缺点:*更复杂,消耗更多服务器资源

将服务器消息推送到客户端的方法主要有两种类型。第一种是WebSocket,它是一种通信协议。它通过单个TCP连接提供双工通信信道。由于双向通信,它非常适合聊天应用程序等场景。另一种称为服务器发送事件(SSE),它允许服务器在建立初始客户机-服务器连接后异步向客户机发送“新数据”。SSE更适合发布者-订阅者模型,如实时流式股票价格;twitter提供更新和浏览器通知。

用户活动状态

用户最后一次处于活动状态是可以在即时消息中找到的标准功能。我们在上面的表1中展示了存储相关信息的数据模型

img

在图4中,我们展示了使用WebSocket在客户端和服务器之间维护连接的机制。一旦在客户端和服务器之间建立了初始连接,通信就会切换到双向二进制协议。客户端和服务器之间的连接使用心跳保持活动状态。我们将上次从用户接收心跳的时间存储在数据库中。然后可以查询数据存储以获取用户上次活动的时间。

优化

我们可以使用下面列出的参数来建议系统中的优化。在本文中,我们提供了建议系统优化所应遵循的方法的详细信息。

  • 延迟:我们可以使用分布式缓存(包括指向分布式缓存的链接),例如Redis,在内存中缓存用户活动状态及其最近聊天的信息。这可能有助于减少应用程序的总体延迟,并提供更好的客户体验。甚至一些数据库解决方案也提供了内存缓存解决方案,如Amazon DynamoDB Accelerator。
  • **基础设施成本:**从系统中可以明显看出,聊天服务器对基础设施成本的重要贡献。如果不控制聊天服务器的足迹,那么聊天服务器产生的成本可能会迅速增加。一种方法是增加每个主机的连接数。这将大大减少维护服务所需的服务器数量。我们可以通过调整服务器配置和选择合适的技术来完成这项任务。例如,WhatsApp的工程师通过优化基于Erlang的服务器应用程序和调优FreeBSD内核,能够在每台主机上实现数百万个连接
  • **可用性:**我们可以维护临时消息的多个副本,这样即使其中一个副本中的消息丢失,也可以从另一个副本中检索。这意味着要维护这些临时消息的副本。客户端将负责从两个队列获取消息,并将它们合并。我们将在下一节中讨论更多内容。

解决瓶颈

系统中更容易发生故障的主要瓶颈是聊天服务器和临时存储解决方案。在下面的部分中,我们推荐了一些处理此类故障的方法。

  • 聊天服务器故障:系统中的聊天服务器将保持与用户的连接。有两种处理聊天服务器故障的方法。一种方法是将这些TCP连接传输到另一台服务器;然而,这种故障转移的实现并非微不足道。第二个相对简单的方法是让用户客户端在连接丢失的情况下自动启动连接。用户连接到的服务器的信息需要在数据库中更新,这与我们采取的方法无关。例如,在图5中,我们展示了处理此故障场景的示例。我们可以看到User1连接到Server1,当该服务器关闭时,将重新建立与另一台服务器(即Server2)的连接,并在数据库中更新此信息。

img

  • 瞬态存储故障:瞬态存储是另一个容易发生故障的组件,可能会导致脱机用户在传输过程中丢失消息。我们可以复制每个用户的临时存储,以防止在他们脱机时发送给他们的消息丢失。当用户重新联机时,将查询并合并用户临时存储的原始实例和副本实例。在图6中,我们展示了一种处理瞬时存储故障的机制,该故障在用户重新联机时启动。

img

监测

我们希望确保我们的服务能够以高可用性和低延迟满足用户需求。我们可以为这些指标定义服务级别协议(SLA),并创建中度和重度监控器,当违反这些SLA时,这些监控器会触发警报。对于此应用程序,我们可以为sendMessage API定义以下SLA。

  • 可用性SLA:p99.999
  • 延迟SLA:p99.99,共5毫秒

可用性SLA意味着,如果1000个请求中有1个以上失败,监控器将触发警报。同样,延迟SLA意味着,如果服务器对其接收的100个请求中超过1个请求的响应时间超过5毫秒,则会触发警报。

此外,我们可以在不同的错误场景中设置故障警报。当聊天服务器无法从临时存储的所有副本中为用户获取临时消息时,可能会出现这种情况。这映射到上面图3所示的步骤#10,其中聊天服务器#B请求临时服务器在Bob脱机时获取发送给Bob的消息。让我们假设我们在临时存储器中维护Bob消息的两个副本,以使系统更加健壮。但是,由于临时存储的临时问题,临时服务器无法从两个副本检索消息。这是一个需要调试的错误场景,因此需要足够的监控警报。

扩展要求

我们可以扩展系统以支持群组聊天,通过群组聊天我们可以将消息传递给多个用户。我们可以创建一个数据模型来存储组数据实体,该实体将由GroupChatID标识,并将用于维护属于该组的人员列表。上述系统可扩展以支持向在线和离线用户发送消息的场景。我们可以构建一个组件,该组件将负责确保根据组中所有用户的活动状态将消息传递给他们。

作为此问题的扩展,可以涵盖的另一个方面是安全性,特别是端到端加密,其中只有通信用户可以读取消息。每个用户都有一个公钥,该公钥与该用户正在通信的所有其他用户共享。例如,两个用户Alice和Bob正在相互通信。Alice拥有Bob的公钥,反之亦然;但是,它们的私钥不共享。当Alice向Bob发送消息时,该消息使用Bob的公钥加密并通过网络发送。服务器将加密的消息定向给Bob,Bob使用私钥解密消息。这样,服务器只能访问加密的消息,只有Alice和Bob才能读取他们交换的实际消息。

img

OpenIM github开源地址:

https://github.com/OpenIMSDK/Open-IM-Server

OpenIM官网 : https://www.rentsoft.cn

OpenIM官方论坛: https://forum.rentsoft.cn/

我们致力于通过开源模式,为全球企业/开发者提供简单、易用、高效的IM服务和实时音视频通讯能力,帮助开发者降低项目的开发成本,并让开发者掌控业务的核心数据。

IM作为核心业务数据,安全的重要性毋庸置疑,OpenIM开源以及私有化部署让企业能更放心使用。

如今IM云服务商收费高企,如何让企业低成本、安全、可靠接入IM服务,是OpenIM的历史使命,也是我们前进的方向。

如您有技术上面的高见请到我们的论坛联系沟通,用户也可与我们的技术人员谈讨使用方面的难题以及见解

从零开始使用WhatsApp API进行应用集成 WhatsApp API允许第三方应用程序与WhatsApp平台进行交互,提供功能包括但不限于发送和接收消息、管理联系人、处理多媒体文件等。API的使用需要注册和获取相应的访问授权。使用WhatsApp API进行应用集成,可以极大地扩展应用的功能性。然而,开发者需要注意网络环境对API访问的影响,并做好相应的技术预备。进一步学习可以参考WhatsApp官方文档,以及第三方博客和论坛的实践经验分享。 阅读详情

相关推荐

OpenIM离线docker部署及应用

介绍OpenIM:由前微信技术专家打造的基于 Go 实现的即时通讯(IM)开源项目,包括IM服务端和客户端SDK。开发者私有化部署,基于SDK二次开发,可以轻松替代第三方IM云服务,打造具备聊天、社交功能的app。无论是开发同城交友、企业办公亦或是当今最热门的元宇宙,还是在应用中集成IM功能,都非常便捷。OpenIM代码100%开源,开源协议Apache-2.0 License任何企业和个人都可以免费使用(包括商用)。请各位看官多多支持,转发和宣传,助力OpenIM成为开源IM的No1。

qiuweifan的博客 3453

移动端常见即时通讯数据库设计

移动端即时通讯数据库表设计

github_37472200的博客 1897

WaCRM:提升电商独立站用户的WhatsApp营销利器

在当今数字化时代,企业与客户之间的沟通方式正在不断演变。WhatsApp作为全球最受欢迎的即时通讯应用之一,已成为企业与客户互动的重要渠道。为了帮助电商独立站用户更有效地利用这一平台,WaCRM应运而生。这款专为Windows平台设计的多账户WhatsApp CRM软件,提供了一系列强大的功能,旨在提升企业的营销和销售效率。

Lee达森的博客 837

「IM开源推荐」前微信技术专家打造,golang实现,一键部署,客户端SDK全平台支持,轻松替代IM云服务

背景 OpenIM成立之初就将“开源”作为核心战略来推进,开源充分体现了自由、平等、分享的互联网精神。 全球范围频繁发生的数据泄露、勒索病毒、隐私滥用等安全事件一次次给企业敲响警钟,企业管理者对数据资产的价值、数据安全的重要性有了更清晰的认识,数据安全成就企业核心价值。 IM作为核心业务数据,安全的重要性毋庸置疑,OpenIM开源以及私有化部署让企业能更放心使用。 如今IM云服务商收费高企,如何让企业低成本、安全、可靠接入IM服务,是OpenIM的历史使命,也是我们前进的方向。 优势 OpenIM:由前微信

OpenIM的博客 2450

STM32F103C8T6键盘DIY全攻略:从电路设计到固件烧录(附避坑指南)

本文详细介绍了基于STM32F103C8T6微控制器的DIY键盘制作全流程,涵盖硬件电路设计、按键矩阵实现、USB HID通信及固件烧录等关键步骤。特别针对常见问题提供避坑指南,帮助开发者高效完成从电路设计到功能实现的完整过程,打造个性化瀚文键盘。

soda5的博客 770

RK3568平台 麦克风PDM接口录音_rk pdm配置

在RK平台,Android的Audio HAL层中一般会都会有导出录音播放数据的功能。如播放的,是会直接送到声卡中的,对于播放出现问题的情况,可以从分析导出的音频数据是否正常,可以基本知道,是在应用、解码出现的问题,还是送到声卡过程中出现问题。当点开app进行录音的时候会调用到static int start_input_stream(struct stream_in *in)。音频在PDM接口输入,不经过编解码芯片直接到RK主芯片,RK主芯片自带PCM编解码功能。以下软件能播放保存下来的pdm文件。

2401_83817122的博客 2343

通俗易懂 即时通讯初学者入门 WhatsApp技术架构

本文译自Codin Gurukul经OpenIM技术人员整理修订后发布。 写在前面 Open-IM是由前微信技术专家打造的开源的即时通讯组件。Open-IM包括IM服务端和客户端SDK,实现了高性能、轻量级、易扩展等重要特性。开发者通过集成Open-IM组件,并私有化部署服务端,可以将即时通讯、实时网络能力快速集成到自身应用中,并确保业务数据的安全性和私密性。 了解更多原创文章: 【OpenIM原创】开源OpenIM:轻量、高效、实时、可靠、低成本的消息模型 【OpenIM原创】C/C++调用golang函

OpenIM的博客 1997

手把手教你学Simulink--基于故障诊断与容错控制的场景实例:电动汽车电机驱动系统的故障检测与隔离

本文介绍了基于Simulink的电动汽车电机驱动系统故障诊断与隔离(FDI)仿真建模方法。通过构建永磁同步电机(PMSM)驱动系统模型,实现了IGBT开路、电流传感器漂移等典型故障的注入与检测。重点阐述了基于观测器的残差生成方法,以及利用Stateflow实现的故障隔离逻辑。仿真结果表明,该系统能在85ms内准确识别故障类型,隔离准确率达97%,并支持容错控制。文章还探讨了AI故障预测、数字孪生等高级应用方向,为电动汽车电驱系统安全提供了完整的仿真解决方案。

MHD0815的博客 961

一个通用即时通讯(IM)系统的设计

本文章参考https://systeminterview.com/design-a-chat-system.php,有删减。 在本章中,我们将探讨聊天系统的设计。几乎每个人都使用聊天应用程序。图12-1显示了市场上一些最流行的应用程序。 聊天应用为不同的人执行不同的功能。确定确切的要求是极其重要的。例如,当面试官考虑一对一聊天时,您不希望设计一个专注于集体聊天的系统。探索功能需求是很重要的。 步骤1-确定需求 当然,世界上没有最完美的架构,只有最合适的架构,也没有所谓的通用方案,不同的解决方案都有其优缺.

OpenIM的博客 2744

LabVIEW状态机实战:用STM32+DHT11搭建温湿度监测系统(附完整VI源码)

本文详细介绍了如何利用LabVIEW状态机模式与STM32微控制器、DHT11温湿度传感器构建温湿度监测系统。通过硬件选型、状态机设计、LabVIEW程序实现及系统优化等环节,提供了一套完整的解决方案,并附有VI源码,助力开发者快速实现嵌入式温湿度监测应用。

weixin_42549723的博客 519

KUKA机器人 - 从开机到自动运行

注1:本文仅代表本人对机器人使用的一些建议,在使用机器人前,还请详细阅读库卡机器人官方资料,道路千万条,安全第一条!!! 注2:技术有限,欢迎各位大大在阅读过程中发现各类问题,并且批评指正!!! 目录 一、准备工作 1. 机器人上电完成 2. 电脑安装Workvisual 二、学习手动移动机器人 三、项目配置 1. 设置机器人IP地址 2.电脑和机器人通过网线连接 3.查找并打开项目 4. 通讯配置 5. 项目上传 6. 检验IO配置 四、编程 1.新建程序 2. 程序...

yilunyao的博客 1万+

**揭秘WhatsApp Web的神秘面纱——一款开源API重构项目**

揭秘WhatsApp Web的神秘面纱——一款开源API重构项目 whatsapp-web-revengReverse engineering WhatsApp Web.项目地址:https://gitcode.com/gh_mirrors/wh/whatsapp-web-reveng 在数字化交流的时代,即时通讯软件已成为我们生活不可或缺的一部分。其中,WhatsApp以其强大的功能和广泛的用...

gitblog_00563的博客 1578

最新Python爬虫实战(入门爬虫篇)——案例3:爬取二次元cos图片批量下载到本地(附上完整爬虫代码)

本次案例通过Python爬虫技术实现了二次元图片的批量下载。代码采用模块化设计,函数实现cookies的自动解析,简化了配置流程,涵盖“请求列表页→提取详情页URL→请求详情页→提取图片链接→保存图片”的完整流程,与豆瓣案例的核心逻辑和格式完全对齐。学习重点包括:抓包工具定位多层级数据源、正则表达式匹配复杂链接、模拟请求头绕过反爬机制、文件名安全处理及自动化文件管理。需要注意控制请求频率并遵守网站使用规范,适用于入门爬虫实践,帮助学习者掌握多层级页面爬取的核心逻辑。

努力让自己发光,对的人才能迎着光而来 14万+

适合WhatsApp网页版的4个最好的免费WhatsApp 群发工具

什么是WhatsApp? WhatsApp Messenger 是一款免费的即时通讯应用程序,可在 Android 和 iPhone 上使用。它允许您一对一或成组地向其他用户发送信息。 在聊天中,WhatsApp 拥有现代消息传递应用程序中获得的所有功能,包括发送照片、分享位置、搜索和发送 GIF 等类似选项。除了核心短信服务,WhatsApp 还支持语音通话、视频通话和录制的语音信息。 WhatsApp 于 2009 年由两位前 Yahoo! 雇员开发。2014 年,Facebook 收购了该应用程

qq_36662478的博客 1万+

Vue3 - 完美解决html2canvas截图不全问题,截图只截取当前可视区域导出图片不全,截屏导出的图片显示不全只有一部分或缺一块,vue3移动端H5网页项目使用html2canvas插件长截图!

vue3,html2canvas,移动端H5网页,截图不全,html2canvas长截图不全,保存长截图,页面滚动导致截图不全,网页下方截屏不到怎么办,底部一部分无法截屏到,保存的图片少了一大块,H5海报截图不完整,怎么截取滚动条下方的内容,截图图时图片不全,截图图片只有一半的问题,底部内容空白,截图空白问题的解决,截图不全怎么办,html2canvas.js网页截图功能(解决截图不全问题,移动端ios系统截图不完整,html2canvas截图太长又不能删减截取不到,使用HTML2Canvas在H5页面上实

🏆 前端领域优质创作者 1万+

【BIM入门实战】Revit创建地形的几种方法及优缺点

Revit在体量和场地选项卡的【地形表面】工具可以创建三维地形,有三种方法:放置点、指定点文件和导入实例文件、倾斜摄影点云技术和InfraWorks地形生成。 文章目录1. 放置点2. 指定点文件3. 导入实例文件4. 倾斜摄影点云技术5. InfraWorks地形生成 1. 放置点 放置点功能位于体量和场地选项卡下地形表面,点开找到放置点,并通过自定义设置点的高程值来创建地形的高程数据。 优点:通过用户自定义高程点来绘制模型,使地形更为精确。 缺点:只适用于面积小的项目,面积太大,人工效率低下。 .

智慧空间实验室 4759

外贸为什么用WhatsApp?WhatsApp如何开展外贸?

越来越多的企业开始将目光投向海外市场,开展外贸业务已经成为了越来越多企业的选择。WhatsApp 是一款即时通讯软件,可以免费发送文字、语音、图片和视频等多种类型的信息,也可以进行语音和视频通话。

NXcloud的博客 1349

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

开启您的即时通讯未来:深入了解OpenIM

开启您的即时通讯未来:深入了解OpenIM open-im-serverIM Chat 项目地址:https://gitcode.com/gh_mirrors/op/open-im-server 在数字交流的时代背景下,即时消息服务成为连接全球社区的桥梁。而在这片广袤的技术蓝海中,OpenIM作为一款专为开发者打造的即时通讯解决方案,正以它卓越的功能和开放的态度,引领着新一代应用开发的趋势。 项...

gitblog_00787的博客 1478

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

即时通讯(IM)开源项目OpenIM对WebAssembly支持,提升web端体验

2019 年 12 月,W3C 标准批准了第四种官方语言:WebAssembly (Wasm)。这种语言在结构、使用和功能方面与以前的语言有很大不同。WebAssembly 是一种新的编码方式,可以在现代的Web浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如 C / C ++等语言提供一个编译目标,以便它们可以在 Web 上运行。它也被设计为可以与 JavaScript 共存,允许两者一起工作。

OpenIM的博客 2654

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IM即时通讯-核心结构体设计(四)

IM即时通讯从0到1的实践,基于golang+gin,redis+mongodb,vue+mui,实现了单聊、离线消息、好友申请等,以及文末对应答机制、重传机制、避免消息重复的探讨。

qq_36034503的博客 1711

WhatsAppBusiness官方说明导读及调研分析

WhatsAppBusiness官方说明导读及调研分析

bossfriday - 个人博客 3115

OpenIM:开源即时通讯整体解决方案深度解析

OpenIM 是一个由前微信技术专家团队研发的全栈开源即时通讯(IM)项目,包含高性能的服务端组件和丰富的客户端 SDK 支持,旨在帮助开发者构建具备实时通信能力的应用程序。 ### 核心特点 - **可扩展性架构**:采用微服务架构设计,易于集成且具备良好的横向扩展能力 - **高并发性能**:轻量级设计配合多协议支持,能够在资源消耗较小的情况下处理大量消息传输 - **完全免费与安全**:

gitblog_00556的博客 1201

OpenIM:如何打造安全可靠的即时通讯服务

即时通讯作为移动应用的常用组件,开发起来却并不简单,除了需要研究通讯协议,保证安全性,还要应对复杂的移动网络情况,以提供高可用性的服务。OpenIM是阿里巴巴推出的,集成于阿里百川项目中的移动端 IM 开放服务。阿里百川是阿里巴巴集团无线开放平台,为移动开发者(涵盖移动创业者)提供快速搭建 APP、加速 APP 商业化、提升用户体验的解...

weixin_34294649的博客 1386

探索Open-IM Server:一款高效、灵活的即时通讯解决方案

探索Open-IM Server:一款高效、灵活的即时通讯解决方案 项目地址:https://gitcode.com/gh_mirrors/op/open-im-server 项目简介 Open-IM Server是一款由OpenIMSDK团队开发的开源即时通讯(IM)服务器。它提供了一整套强大的实时通信功能,包括文本消息、语音通话、视频聊天、群组管理等,适用于各种移动应用和Web应用的集成。该项...

gitblog_00044的博客 1847

100亿次的挑战:如何实现一个“有把握”的春晚摇一摇系统

这是2015年年初(羊年春晚)摇一摇活动的技术复盘文章。在数年之后再次温习,有很多架构上的取舍仍然可以给类似的活动参考,因此重新发出来。 羊年春晚摇一摇活动已经落下帷幕,现在回过头来看看这一全民参与的有趣的活动背后,有着怎样的后台系统?这个系统又是如何被设计与实现出来的? 春晚摇一摇活动 在了解这个系统之前,先看看羊年春晚有哪些活动形式?春晚摇一摇复用了摇一摇入口,但提供了全新的界面和交互内容。 在羊年春晚摇一摇界面里,用户摇动手机后,可以看到明星拜年、全家福、好友贺卡等精彩纷呈的活动页;也会有温馨的.

OpenIM的博客 407
上一篇: 【IM开源推荐】前微信技术专家打造的开源的即时通讯组件OpenIM
下一篇: 【OpenIM原创】uni-app使用之 初始化会话 消息 好友 监听器
OpenIM
博客等级 码龄5年 295粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值