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

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

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

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

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

相关文章

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方