升讯威在线客服系统如何高性能同时支持 MySQL 和 SQL Server

news/2024/12/25 13:22:08/文章来源:https://www.cnblogs.com/sheng_chao/p/18420385

升讯威在线客服与营销系统是基于 .net core / WPF 开发的一款在线客服软件,宗旨是: 开放、开源、共享。努力打造 .net 社区的一款优秀开源产品。

前段时间我发表了一系列文章,开始介绍基于 .net core 的升讯威在线客服系统开发过程。
随时 Linux + MySQL 的广泛应用, 必须让系统同时支持 SQL Server 和 MySQL。

并行查询技术

并行 LINQ (PLINQ) 是语言集成查询 (LINQ) 模式的并行实现。 PLINQ 将整套 LINQ 标准查询运算符实现为 System.Linq 命名空间的扩展方法,并提供适用于并行操作的其他运算符。 PLINQ 将 LINQ 语法的简洁和可靠性与并行编程的强大功能结合在一起。

什么是并行查询

一个 PLINQ 查询的许多方面都类似于非并行的 LINQ to Objects 查询。 与顺序 LINQ 查询一样,PLINQ 查询对任何内存中 IEnumerable 或 IEnumerable 数据源执行操作,并且推迟了执行,即在枚举查询前不会开始执行。 主要区别在于,PLINQ 会尝试充分利用系统上的所有处理器。 方法是将数据源分区成片段,然后在多个处理器上针对单独工作线程上的每个片段执行并行查询。 在许多情况下,并行执行意味着查询运行速度显著提高。

通过并行执行,通常只需向数据源添加 AsParallel 查询操作,PLINQ 即可显著提升性能(与某些类型查询的旧代码相比)。 但是,并行可能会引入其自身的复杂性,因此并非所有的查询操作的运行速度在 PLINQ 中都更快。 事实上,并行实际上会降低某些查询的速度。 因此,应了解排序等问题将如何对并行查询产生影响。

PLINQ 查询性能的影响因素

下面各部分列出了并行查询性能的一些最重要的影响因素。 这些都是一般性说明,本身并不足以用于在所有情况下预测查询性能。

  1. 整体工作的计算成本。
    为了实现加速,PLINQ 查询必须有足够多的适合并行操作来抵消开销。 工作可以表示为每个委托的计算成本乘以源集合中的元素数量。 假设操作可以并行执行,它的计算成本越高,加速的机会就越大。 例如,如果函数的执行时间为 1 毫秒,那么超过 1000 个元素的顺序查询需要 1 秒的时间才能执行此操作,而在四核计算机上,并行查询可能只需要 250 毫秒就能完成。 这就产生 750 毫秒的加速。 如果函数执行每个元素需要 1 秒,就会产生 750 秒的加速。 如果委托成本很高,PLINQ 可能会让速度显著提升,前提是源集合中只有几项。 相反,包含最简单的委托的小型源集合通常不适合执行 PLINQ。
    在下面的示例中,queryA 可能很适合执行 PLINQ,前提是它的 Select 函数涉及很多工作。 queryB 可能不适合执行 PLINQ,因为 Select 语句中没有足够多的工作,并行开销会抵消大部分或全部加速。
var queryA = from num in numberList.AsParallel()  select ExpensiveFunction(num); //good for PLINQ  var queryB = from num in numberList.AsParallel()  where num % 2 > 0  select num; //not as good for PLINQ  
  1. 系统上的逻辑内核数量(并行度)。
    这一点是上一部分的必然结果,在具有更多内核的计算机上,适合并行查询运行得更快,这是因为可以在更多并发线程之间划分工作。 加速总量取决于查询整体工作的并行度百分比。 不过,不要认为所有查询在八核计算机上的运行速度都是在四核计算机上的两倍。 优化查询以实现最佳性能时,请务必在具有不同数量内核的计算机上度量实际结果。 这一点与第 1 点相关:需要更大的数据集,才能利用更多的计算资源。

  2. 操作的数量和种类。
    如果有必要维护源序列中的元素顺序,PLINQ 提供 AsOrdered 运算符。 虽然排序有相关成本,但此成本通常还算低。 GroupBy 和 Join 操作同样也会产生开销。 如果允许按任意顺序处理源集合中的元素,并在准备就绪后立即将它们传递给下一个运算符,PLINQ 的性能最佳。

  3. 查询执行形式。
    若要通过调用 ToArray 或 ToList 存储查询结果,所有并行线程的结果都必须合并到一个数据结构中。 这就涉及不可避免的计算成本。 同样,如果使用 foreach(Visual Basic 中的 For Each)循环来循环访问结果,工作线程的结果必须串行化到枚举器线程。 不过,如果只想根据每个线程的结果执行某操作,可以使用 ForAll 方法对多个线程执行此操作。

  4. 合并选项类型。
    PLINQ 可以配置为缓冲输出并在生成整个结果集后分块区生成或一次性全部生成,也可以配置为在各个结果生成时流式传输它们。 前一个导致总体执行时间减少,后一个导致所生成元素之间的延迟减少。 尽管合并选项不一定会对总体查询性能造成重大影响,但它们可能会影响感知性能,因为它们控制用户在看到结果前必须等待的时间。

选择使用模型

var source = Enumerable.Range(1, 10000);// Opt in to PLINQ with AsParallel.
var evenNums = from num in source.AsParallel()where num % 2 == 0select num;
Console.WriteLine("{0} even numbers out of {1} total",evenNums.Count(), source.Count());
// The example displays the following output:
//       5000 even numbers out of 10000 total

AsParallel 扩展方法将后续查询运算符(在此示例中为 where 和 select)绑定到 System.Linq.ParallelEnumerable 实现。

执行模式

默认情况下,PLINQ 是保守的。 在运行时,PLINQ 基础结构将分析查询的总体结构。 如果通过并行可能会提高查询速度,PLINQ 则将源序列分区为可以同时运行的任务。 如果并行化查询不安全,PLINQ 则只会按顺序运行查询。 如果 PLINQ 可以在可能会较昂贵的并行算法或成本较低的顺序算法之间进行选择,它会默认选择顺序算法。 可以使用 WithExecutionMode 方法和 System.Linq.ParallelExecutionMode 枚举指示 PLINQ 选择并行算法。 如果你通过测试和测量知道特定查询以并行方式执行得更快时,此做法非常有用。

并行度

默认情况下,PLINQ 使用主机计算机上的所有处理器。 可以使用 WithDegreeOfParallelism 方法指示 PLINQ 使用不超过指定数量的处理器。 当你要确保计算机上运行的其他进程收到一定的 CPU 时间量时,此做法将非常有用。 下面的片段将查询限制为最多使用两个处理器。

var query = from item in source.AsParallel().WithDegreeOfParallelism(2)where Compute(item) > 42select item;

在查询要执行大量非受计算限制的工作(如文件 I/O)的情况下,最好指定比计算机上的内核数要大的并行度。

已排序和未排序的并行查询

在某些查询中,一个查询运算符必须产生保留源序列排序的结果。 为此,PLINQ 提供了 AsOrdered 运算符。 AsOrdered 不同于 AsSequential。 尽管仍并行处理 AsOrdered 序列,但会缓冲和排序它的结果。 由于顺序暂留通常涉及额外的工作,因此处理 AsOrdered 序列可能比处理默认 AsUnordered 序列更慢。 特定的已排序并行操作是否比操作的顺序版本更快取决于许多因素。

下面的代码示例演示了如何选择使用顺序保留。

var evenNums =from num in numbers.AsParallel().AsOrdered()where num % 2 == 0select num;

并行和顺序查询

某些操作要求按顺序提供源数据。 必要时,ParallelEnumerable 查询运算符自动还原为顺序模式。 对于要求顺序执行的用户定义的查询运算符和用户委托,PLINQ 提供了 AsSequential 方法。 使用 AsSequential 时,查询中的所有后续运算符都会顺序执行,直到再次调用 AsParallel。

异常

当一个 PLINQ 查询执行时,可能会同时从不同的线程引发多个异常。 此外,处理异常的代码可能与引发异常的代码处于不同的线程上。 PLINQ 使用 AggregateException 类型封装查询抛出的所有异常,并将这些异常封送回调用线程。 在调用线程上,只需要一个 try-catch 块。 不过,可以循环访问在 AggregateException 中封装的所有异常,并捕获任何可以安全恢复的异常。 在极少数情况下,可能会抛出一些未在 AggregateException 中包装、ThreadAbortException 也没有进行包装的异常。

如果允许异常向上冒泡回到联接线程,则查询也许可以在引发异常后继续处理一些项。

自定义分区程序

在某些情况下,可以通过编写利用源数据的某些特征的自定义分区程序来提高查询性能。 在查询中,自定义分区程序本身是被查询的可枚举对象。

--

验证与测试

下文我将介绍如何快速部署升讯威在线客服系统,来测试验证并行查询技术的效果。

  • CentOS 安装配置 MySQL 数据库,创建数据库,执行脚本创建表结构。
  • 安装 Nginx,反向代理到客服系统服务端,并设置开机自启动
  • 安装 .net core ,部署客服系统并开机自启动

我详细列出了需要执行的命令的全过程,跟随本文可以在 30 分钟内完成部署。

完整私有化包下载地址

💾 https://kf.shengxunwei.com/freesite.zip

当前版本信息

发布日期: 2024-9-18
数据库版本: 20240413b
服务器版本: 1.15.5.0
客服程序版本: 1.15.19.0
更新程序版本: 1.2.1.0
资源站点版本: 1.7.20.0
Web管理后台版本: 2.3.1

准备操作系统

  • 本文以 CentOS 7.9 为例进行说明,其它版本的 Linux 安装配置过程大同小异。

开放防火墙端口

客服系统默认使用 9527 端口进行通信,如果开启了防火墙,请在防火墙中开放此端口。

也可以更改为其它可用端口号,在后续配置客服系统服务端程序时要做对应的修改。

请确保您所使用的主机服务商提供的防火墙服务中,也开放了对应端口。如阿里云服务器需要在安全组规则中配置。

安装 MySQL 数据库引擎

  1. 下载
    wget http://dev.mysql.com/get/mysql80-community-release-el7-10.noarch.rpm

如果提示 command not found,则先执行 yum -y install wget 安装

注意:此下载地址适用于 CentOS 7 ,如果您使用的是 CentOS 8,请将 rpm 包名更换为 mysql80-community-release-el8-8.noarch.rpm
不同版本的 MySQL Community 版本下载请参阅:https://dev.mysql.com/downloads/

  1. 安装
    rpm -ivh mysql80-community-release-el7-10.noarch.rpm
    yum install mysql-community-server -y

  2. 检查是否安装成功
    rpm -qa | grep mysql

输出类似:
mysql-community-client-plugins-8.0.34-1.el7.x86_64
mysql-community-libs-8.0.34-1.el7.x86_64
mysql-community-icu-data-files-8.0.34-1.el7.x86_64
mysql-community-server-8.0.34-1.el7.x86_64
mysql80-community-release-el7-10.noarch
mysql-community-common-8.0.34-1.el7.x86_64
mysql-community-client-8.0.34-1.el7.x86_64

  1. 启动
    sudo systemctl start mysqld

  2. 设置开机自启动
    sudo systemctl enable mysqld

  3. 查看安装时生成的临时密码
    sudo cat /var/log/mysqld.log |grep password

  4. 使用临时密码连接 MySQL
    mysql -uroot -p

  5. 修改 root 密码
    alter user root@localhost identified with mysql_native_password by '你的密码';

密码必须包含大写字母、小写字母、数字、特殊符号

  1. 退出 MySQL 连接
    exit

安装 Nginx

  1. 安装 Nginx
    sudo yum install -y nginx

如果提示 No package nginx available,则先执行

  • yum install epel-release -y

安装成功后:
可执行文件为:/usr/sbin/nginx
默认的网站目录为: /usr/share/nginx/html
默认的配置文件为:/etc/nginx/nginx.conf
自定义配置文件目录为: /etc/nginx/conf.d/

  1. 启动 Nginx
    systemctl start nginx

  2. 启用开机启动 Nginx
    systemctl enable nginx

安装 .Net Core

  1. 配置安装源
    sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm

  2. 安装
    sudo dnf install dotnet-sdk-3.1

如果提示 command not found,则先执行

  • yum -y install dnf
  1. 确认安装成功

在命令行输入 dotnet 看到类似如下提示,表示安装成功。

配置服务器主程序

请确认已经完成了对服务器主程序配置文件的配置。
参阅:使用自动化工具配置服务器端程序

访客聊天测试

登录客服端以后,用浏览器打开你的资源站点域名下的聊天页面,如:

kf-resource.shengxunwei.com/WebChat/WebChat.html?sitecode=freesite

开始聊天。

发布

将配置好的客服端程序 Shell 目录,压缩或打包分发给客服使用即可。

集成

  • 集成到您的网站
  • 集成到您的手机APP
  • 集成到您的公众号等平台
  • 深度集成:传递您的访客数据到客服系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799824.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易优eyoucms网站留言验证码怎么调用

前台留言模型的图形验证码标签调用 比如需要在留言表单里加入图形验证码,复制下方黄色代码在留言标签中 {eyou:guestbookform}{eyou:guestbookform type=default}<form method="POST" enctype="multipart/form-data" action="{$field.action}&quo…

易优eyoucms网站留言增加验证码功能

<!-- 验证码开始 -->{eyou:notempty name=$field.IsVertify}<div><input type="text" name="vertify" autocomplete="off" placeholder="图片验证码"/><img {$field.VertifyData} title="看不清?点击更换验…

易优eyoucms网站系统报错:unserialize(): Error at offset 0 of 1571 bytes

遇到“unserialize(): Error at offset 0 of 1571 bytes”这类错误,通常是因为缓存文件损坏或格式不正确。针对EyouCMS 1.5.1版本,可以采取以下步骤来解决这个问题: 解决方案一:清除缓存文件通过FTP访问服务器:使用FTP客户端(如FileZilla、WinSCP等)连接到服务器。 导航…

易优eyoucms网站表单留言增加验证码怎么做

前台留言模型的图形验证码标签调用 比如需要在留言表单里加入图形验证码,复制下方黄色代码在留言标签中 {eyou:guestbookform}{eyou:guestbookform type=default}<form method="POST" enctype="multipart/form-data" action="{$field.action}&quo…

洛谷 P5569 石子合并——题解

洛谷P5569题解传送锚点摸鱼环节 [SDOI2008] 石子合并 题目描述 在一个操场上摆放着一排 \(N\) 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的 \(2\) 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将 \(N\) 堆石子合并成…

VMware ESXi 8.0U3b macOS Unlocker OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U3 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:…

【日记】书荒了(337 字)

正文几乎玩了一周之后上班的第一天。确实有些惫懒。基本都在解决一些之前代班同事留下来的遗留工作。整理了一下,发现工作清单上好多任务都没什么意义。今天打印准考证,发现考试地点在市里…… 本来还想着,考完去找灵玩儿,这下不行了。而且一天考两科。这我是真没想到。所以…

“DLL load failed: 找不到指定的模块。”的一种解法

问题来源: 本身在Al studio的环境训练是没问题的,由于某些问题在平台不好弄,于是copy了项目,anconda建立了paddle-gpu的虚拟环境也搭建了,但是在跑项目的时候出现了如下错误:网上了查看了许多方法,参考着试了不少 测试方法一:缺少的dll文件补上了,失败告终 测试方法二…

py3.7+win10的cv2.xfeatures2d_SIFT.create()函数不存在问题

python3.7 环境window10 64位 cv2包问题。问题 做图片处理用opencv-python做模板匹配的时候会用个sift模型,就会用到cv2.xfeatures2d_SIFT.create()这个函数,在我正要用它增加自己知识,巴拉巴啦....的时候,咦?!这是个什么鬼哦,没有这个函数呢。 百度发现需要什么卸载原版…

聊聊位运算一些注意事项

目录位运算位运算和逻辑运算区别位运算的几点注意异或的运算规则异或的经典问题:两数交换位操作建议使用宏定义好后使用位运算整型提升问题左移和右移概念移位运算容易误解成移位赋值 位运算位运算和逻辑运算区别 位运算是一位对应一位的对所有位逐一进行运算(逐比特位进行运算…

频繁改版惹人烦?火山引擎数据飞轮两招直击APP痛点促增长

APP精准有效的自我迭代,能够为其带来用户粘性增强与活跃度增长,而随之不断增长的用户使用量又会带来更加丰富的数据,从而支撑 APP 实现更为精准科学的洞察。更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 你应该遇到过这样的情况:…

易优eyoucms网站安装一直显示未知错误,无法继续

遇到“未知错误”并且在多台服务器上都无法完成安装的情况,可能是因为一些特定的环境配置问题。根据提供的信息,这里有几个可能的原因及解决方法:数据库版本问题:如果数据库版本较高(例如MySQL 8.x),而EyouCMS仅支持较旧的版本(如MySQL 5.6),那么将数据库版本回退到E…