升讯威在线客服系统的并发高性能数据处理技术:为多线程处理同步数据

本文主要是介绍升讯威在线客服系统的并发高性能数据处理技术:为多线程处理同步数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户。对我来说,只要能获得用户的认可,就是我最大的动力。

最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可。
客户组织多名客服上线后,所有员工同一时间打开访客页面疯狂不停的给在线客服发消息,系统稳定无异常无掉线,客服回复消息正常。消息实时到达无任何延迟。

https://kf.shengxunwei.com/


我会通过一系列的文章详细分析升讯威在线客服系统的并发高性能技术是如何实现的,使用了哪些方案以及具体的做法。本文将介绍如何为多线程处理同步数据。

先看实现效果

客服端

访客端

为多线程处理同步数据

多个线程可以调用单个对象的属性和方法时,对这些调用进行同步处理是非常重要的。 否则,一个线程可能会中断另一个线程正在执行的任务,可能使该对象处于无效状态。 其成员不受这类中断影响的类叫做线程安全类。

  • .NET 提供了几种策略,用于同步对实例和静态成员的访问:

  • 同步代码区域。 可以使用 Monitor 类或此类的编译器支持,仅同步需要它的代码块,从而提升性能。

  • 手动同步。 可以使用 .NET 类库提供的同步对象。 请参阅同步基元概述,其中介绍了 Monitor 类。

  • 同步上下文。 仅对于 .NET Framework 和 Xamarin 应用程序,你可以使用 SynchronizationAttribute 为 ContextBoundObject 对象启用简单的自动同步。

  • System.Collections.Concurrent 命名空间中的集合类。 这些类提供了内置的同步添加和删除操作。 有关详细信息,请参阅线程安全集合。

公共语言运行时提供一个线程模型,在该模型中,类分为多种类别,这些类别可以根据要求以各种不同的方式进行同步。 下表显示了为具有给定同步类别的字段和方法提供的同步支持。

同步代码区域

可以使用 Monitor 类或编译器关键字,同步代码块、实例方法和静态方法。 不支持同步静态字段。

Visual Basic 和 C# 都支持使用特定语言关键字标记代码块,在 C# 中使用的是 lock 语句,在 Visual Basic 中使用的是 SyncLock 语句。 由线程执行代码时,会尝试获取锁。 如果该锁已由其他线程获取,则在锁变为可用状态之前,该线程一直处于阻止状态。 线程退出同步代码块时,锁会被释放,与线程的退出方式无关。

由于 lock 和 SyncLock 语句是使用 Monitor.Enter 和 Monitor.Exit 实现,因此 Monitor 的其他方法可以在同步区域内与它们结合使用。

还可以使用值为 MethodImplOptions.Synchronized 的 MethodImplAttribute 修饰方法,其效果和使用 Monitor 或其中一个编译器关键字锁定整个方法正文相同。

Thread.Interrupt 可用于中断对线程执行阻止操作(如等待访问同步代码区域)。 Thread.Interrupt 还用于中断对线程执行 Thread.Sleep 等操作。

Visual Basic 和 C# 均支持使用 Monitor.Enter 和 Monitor.Exit 锁定对象的语言关键字。

在这两种情况下,如果代码块中引发异常,则 lock 或 SyncLock 获取的锁将自动释放。 C# 和 Visual Basic 编译器在发出 try/finally 块时,在 try 的起始处使用 Monitor.Enter,在 finally 块中使用 Monitor.Exit。 如果 lock 或 SyncLock 块内部引发了异常,则会运行 finally 处理程序,从而允许执行任何清除工作。

WaitHandle 类和轻量同步类型

多个 .NET 同步基元派生自 System.Threading.WaitHandle 类,该类会封装本机操作系统同步句柄并将信号机制用于线程交互。 这些类包括:

  • System.Threading.Mutex,授予对共享资源的独占访问权限。 如果没有任何线程拥有它,则 mutex 将处于已发出信号状态。

  • System.Threading.Semaphore,限制可同时访问某一共享资源或资源池的线程数。 当信号量计数大于零时,会将信号量的状态设置为已发出信号;当信号量计数为零时,会将信号量的状态设置为未发出信号。

  • System.Threading.EventWaitHandle,表示线程同步事件,可以处于已发出信号状态或未发出信号状态。

  • System.Threading.AutoResetEvent,派生自 EventWaitHandle,当发出信号时,会在发布单个等待线程后自动重置为未发出信号状态。

  • System.Threading.ManualResetEvent,派生自 EventWaitHandle,当发出信号时,会保持已发出信号状态,直到调用 Reset 方法。

在 .NET Framework 中,由于 WaitHandle 派生自 System.MarshalByRefObject,因此,这些类型可用于跨应用程序域边界同步线程的活动。

轻量同步类型不依赖于基础操作系统句柄,通常会提供更好的性能。 但是,它们不能用于进程间同步。 将这些类型用于一个应用程序中的线程同步。

其中的一些类型是派生自 WaitHandle 的类型的替代项。 例如,SemaphoreSlim 是 Semaphore 的轻量替代项。

同步对共享资源的访问

System.Threading.Monitor 类通过获取或释放用于标识资源的对象上的 lock 来授予对共享资源的相互独占访问权限。 持有 lock 时,持有 lock 的线程可以再次获取并释放 lock。 阻止任何其他线程获取 lock,Monitor.Enter 方法等待释放 lock。 Enter 方法可获取释放的 lock。 还可以使用 Monitor.TryEnter 方法指定线程尝试获取 lock 的持续时间。 由于 Monitor 类具有线程关联,因此获取了 lock 的线程必须通过调用 Monitor.Exit 方法来释放 lock。

可以通过使用 Monitor.Wait、Monitor.Pulse 和 Monitor.PulseAll 方法来协调用于获取同一对象上的 lock 的线程的交互。

System.Threading.Mutex 类(与 Monitor 类似),授予对共享资源的独占访问权限。 使用 Mutex.WaitOne 方法重载之一请求 mutex 的所有权。 Mutex(与 Monitor 类似)具有线程关联,并且已获取 mutex 的线程必须通过调用 Mutex.ReleaseMutex 方法来释放它。

Mutex 类(与 Monitor 不同)可用于进程间同步。 为此,请使用命名 mutex,它在整个操作系统中都可见。 若要创建命名 mutex 实例,请使用指定了名称的 Mutex 构造函数。 还可以调用 Mutex.OpenExisting 方法来打开现有的命名系统 mutex。


简介

升讯威在线客服与营销系统是一款客服软件,但更重要的是一款营销利器。

https://kf.shengxunwei.com/

  • 可以追踪正在访问网站或使用 APP 的所有访客,收集他们的浏览情况,使客服能够主动出击,施展话术,促进成单。
    访* 客端在 PC 支持所有新老浏览器。包括不支持 WebSocket 的 IE8 也能正常使用。
  • 移动端支持所有手机浏览器、APP、各大平台的公众号对接。
  • 支持访客信息互通,可传输访客标识、名称和其它任意信息到客服系统。
  • 具备一线专业技术水平,网络中断,拔掉网线,手机飞行模式,不丢消息。同类软件可以按视频方式对比测试。
    • 优酷视频:https://v.youku.com/v_show/id_XNTEwNzQ5Mzg2OA==.html
    • bilibili 视频:https://www.bilibili.com/video/BV1pK4y1N7UP?t=22

希望能够打造: 开放、开源、共享。努力打造 .net 社区的一款优秀开源产品。

钟意的话请给个赞支持一下吧,谢谢~

这篇关于升讯威在线客服系统的并发高性能数据处理技术:为多线程处理同步数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/276334

相关文章

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断