引言

在开发IM即时通讯应用时,架构设计是项目成功的关键之一。好的架构设计既能保证系统的灵活性与可扩展性,又能避免过度设计带来的复杂性,进而影响项目进度和后期维护。如何找到一个平衡点,成为了设计的核心问题。过度设计会增加项目的复杂性,导致进度滞后,而提前设计有时又无法应对未来需求的变化。因此,在开发星联App时,追求的是一个既简洁又高效的系统架构,能应对当前需求并具备未来扩展的潜力。

客户端设计

客户端部分采用原生Android进行开发,结合Java和Kotlin的混合编程模式。由于我之前主要使用Java进行Android开发,这次希望通过实战深入学习Kotlin,并借此提升项目的现代化水平。

基础技术选型

  • 数据库MMKVObjectBox

    在即时通讯应用中,消息存储和读取的效率直接关系到应用的响应速度和用户体验。为此选择了两款高效的存储方案:MMKVObjectBox

    • ObjectBox:作为一款高性能的数据库,ObjectBox是由Greendao团队开发的,专为移动设备优化,相比传统的SQLite,它提供了更高的性能和更简洁的API,特别适合存储大量的消息数据。ObjectBox支持高效的离线存储,具备低延迟的数据访问和高吞吐量的能力,可以快速处理IM消息的存取需求。在开发过程中,ObjectBox还提供了强大的多线程支持,保证在并发环境下数据的稳定性和高效性。
    • MMKV:MMKV是腾讯开源的高效键值对存储框架,特别适用于存储少量的配置信息或者用户数据。在即时通讯应用中,MMKV主要用于存储一些用户的配置、缓存以及短期内需要频繁读取的小型数据,比如会话列表、消息通知设置等。MMKV相较于传统的SharedPreferences,提供了更高的读写性能,尤其在多进程场景下表现更为出色,可以有效避免并发访问导致的问题。
  • 实时通信:WebSocket协议

    在即时通讯应用中,消息的实时性是最关键的需求之一。为了实现高效且低延迟的双向通信,选择了WebSocket协议。

    WebSocket是一种全双工通信协议,它通过一个持久连接在客户端和服务器之间保持开放的通信通道。与传统的轮询和长轮询方法相比,WebSocket减少了多次请求的开销,同时也避免了不必要的资源浪费。WebSocket在建立连接后,客户端和服务器能够随时互相发送数据,这对于即时通讯来说,能够极大地提升消息传输的速度和实时性。

    • 低延迟:WebSocket能够减少延迟,确保消息能够在最短的时间内从发送方传输到接收方,确保了即时通讯的及时性。
    • 高效传输:在网络连接建立后,客户端和服务器之间通过一个持久连接进行双向通信,极大地减少了通信过程中的开销,避免了不断建立和关闭连接的浪费。
    • 可靠性:WebSocket协议的持久连接保证了消息能够可靠地传输,即使在网络不稳定的情况下,消息也能通过重连机制保证传递。
  • 网络请求和API封装

    • 网络请求库:Retrofit + OkHttp

      Retrofit是一个类型安全的HTTP客户端,简化了API请求和响应的处理,而OkHttp是一个高效的HTTP客户端库,通常与Retrofit一起使用,提供更底层的网络请求支持。

      • 简化API调用:Retrofit的注解使得网络请求的定义变得非常简洁,通过接口和注解的方式直接将HTTP请求映射为Kotlin函数。
      • 支持异步请求:通过与Kotlin协程结合,Retrofit支持异步请求,可以轻松处理网络请求的并发和回调。
      • OkHttp的拦截器:OkHttp可以配置拦截器,便于日志记录、网络错误处理以及自定义请求头等功能的实现。
  • 图像加载库Glide

    Glide是一个广泛使用的图像加载库,适用于Android应用,能够高效地加载、缓存和显示图片,特别是在处理大尺寸图像、GIF动画和图像优化方面表现出色。

    • 图片加载与缓存:Glide采用了内存缓存和磁盘缓存机制,可以有效地减少重复加载图片,优化性能。通过内存缓存,图片会被保存在内存中,下一次加载相同图片时可以直接从缓存中获取,而不需要重新从网络加载。磁盘缓存则帮助保存图片,避免每次重新下载。
    • GIF和动态图像支持:Glide不仅支持静态图片,还能够处理GIF动画和其他格式的动态图像,适用于即时通讯应用中的表情包和动态头像等功能。
    • 占位符与错误图像:Glide允许开发者设置加载图片时的占位符和加载失败时显示的错误图像,能够提升用户体验,避免在图片加载过程中出现空白区域。
    • 图像裁剪与变换:Glide提供了强大的图像裁剪、变换和缩放功能,可以根据需要调整图像的显示效果。例如,圆形裁剪用于显示头像,或者根据屏幕大小调整图像的大小,避免加载过大或过小的图片。
    • 内存管理:Glide会自动根据系统内存情况调整缓存策略,确保应用在低内存环境下也能平稳运行。它还提供了内存使用的详细控制,避免图片缓存过多占用系统资源。
  • 架构设计:类MVVM架构

    在星联App的开发中,采用了类MVVM架构,以更好地解耦UI和业务逻辑,并提升系统的可维护性和可扩展性。说是类mvvm结构其实主要是因为未使用DataBinding,因为我感觉使用DataBinding会导致布局与数据进行了耦合,这个做法不是特别推荐

    • Model:负责数据的获取和存储,处理与外部数据源(如数据库、网络)的交互。在星联App中,Model主要负责管理本地存储的消息数据,并通过WebSocket协议接收和发送消息。
    • View:负责展示UI界面,用户与应用的交互都通过View层进行。View层通常不直接处理数据,而是通过观察ViewModel来显示数据。
    • ViewModel:作为Model和View之间的中介,负责从Model获取数据并将数据传递给View。ViewModel不直接处理UI操作,它将UI的状态和逻辑从View中抽离出来,确保UI与业务逻辑解耦。通过LiveData等方式,ViewModel能够在数据变化时通知View更新UI。

    MVVM架构的优势在于它能够简化复杂的UI状态管理,提升代码的复用性,并减少代码间的耦合。在星联App中,MVVM架构使得可以在在不影响UI层的情况下进行业务逻辑的修改和扩展,提高了开发效率。

技术方案总结

  • 高效存储:通过结合ObjectBox和MMKV,实现了高效、稳定的本地数据存储方案。
  • 实时通信:使用WebSocket协议实现低延迟、高效率的双向数据传输。
  • 安全可靠:通过HTTPS协议保证所有数据传输的安全性,防止中途数据泄漏。
  • 架构设计:采用MVVM架构实现业务逻辑、UI和数据的解耦,提高了代码的可维护性和可扩展性。

结语

随着开发的深入,后续的技术方案还会根据需求进行调整与扩展,确保应用能够持续满足用户的高效通讯需求。随着项目进展,更多的技术方案和架构设计将陆续与大家分享。