- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程。本产品已经成熟稳定并投入商用.
免费使用 & 私有化部署免费下载: https://docs.shengxunwei.com/Post/f7bc8496-14ee-4a53-07b4-08d8e3da6269 。
视频实拍:演示升讯威在线客服系统在网络中断,直接禁用网卡,拔掉网线的情况下,也不丢消息,不出异常。 https://blog.shengxunwei.com/Home/Post/fe432a51-337c-4558-b9e8-347b58cbcd53 。
本文开个小差,不谈技术话题,谈一谈在做产品过程中,种子用户的重要性以及如何对待你的种子用户.
我开发在线客服系统,经历了两个阶段,在我之前的博客中有提及,开始着手做这款产品大约在2015年,坚持了2年之后换了方向,直到2020年,我重新捡起这块工作,做了大的重构,完成了这个产品.
本文对2020年开始继续这款产品的开发至今,对我有过重大帮助的种子用户进行了记录,并详细说明了我是如何与宝贵的种子用户沟通交流,共同完善产品的.
在这里我首先感谢下文中提到的 A 、B、C 三个种子用户。 没有这几个种子用户,产品的完成、完善、稳定可能还会走很多弯路,花费很长时间。 特别是在这期间,也有过几个用户试用后因为出现故障直接放弃的,相比之下,三个种子用户的包容与耐心更加弥足珍贵.
种子用户A:
催生产品的重要用户.
2020 年我刚捡起这块工作继续开始做没多久,就有朋友寻着我 2015 年发的博客找到了我,询问这款产品的开发情况,我如实相告刚刚开始着手重构,准备彻底完成然后发新版本。A 朋友仔细阅读了解了我之前的博客,经过持续的沟通和深入的了解,在我还没有完成时,就果断预定了产品.
我在开始在线客服系统的继续开发时,对是不是能够坚持做完,做完善,心里并没有多少底,也没有计划,只是业余只要有空闲,就打开电脑开始做,做多少算多少.
可以说正是因为有了 A 用户的坚定支持,以及三不五时的“催更”。才让这件事情有了比较严谨的计划性,以及对功能范围的清晰定义。包括当时的一个重要指导思路:先完成核心功能,使之稳定可靠,不重要的外围功能和细节先放一放,留在以后通过热更新的方式逐步完善.
大约 2020 年 11 月左右,终于完成了第一个版本,简单测试之后上线了.
没有意外,接下来的一段时间,各种救火…… 。
问题一:客服网络线路不好,容易掉线 在最初的设计中,客服端与服务器建立基于 TCP/IP 的长连接,只要网络中断,则认为客服下线或掉线,退出重新登录,当时认为这个逻辑没问题。 A 用户实际使用时,客服办公室网络到服务器之间的连接很不稳定,断线比较频繁,基本都是闪断,估计持续时间不超过几秒钟,但只要闪断,程序就认为客服下线,走下线流程,对客服的实际使用有比较大的影响。 网络问题是客观存在的,只能从软件层面去优化适配,我花了大力气实现了断点续传,使得客服在网络闪断时,软件不再退出,数据也不再释放,程序自动恢复连接之后完成数据同步。 这个过程很不容易,具体的实现方案也几经变更,最终完美解决,我录制了视频演示了这个机制作用的效果。 https://blog.shengxunwei.com/Home/Post/fe432a51-337c-4558-b9e8-347b58cbcd53 。
问题二:不可避免的小 BUG 毕竟产品初步完成,没有严谨的测试流程,一些小 BUG 不可避免,正是因为有了 A 用户,才使得产品在正式发布之前能够在实际场景下验证,一点一点修复掉这些问题。在使用过程中反馈的意见,用户体验问题,我都特别重视,能优化的都会优化掉。 做产品和做项目有很大的不同,做项目一般功能完成和 BUG 修复之后,就得验收结款了。做产品时就不是这个流程,对用户的反馈,用户的意见,都会非常重视。特别是种子用户,绝对的尊重和感谢的态度来处理他们的意见.
种子用户 B:
产品能够完美支持 Linux + MySQL 平台的重要帮助者.
虽然服务器端是 .net core 平台,但在产品发布时,我只测试了 Windows 平台,数据库也只支持 SQL Server ,B 用户将其部署在了 CentOS 上,随后热心的联系我,向我反馈了部署在 CentOS 上出现的问题,甚至帮我提出了解决的方案。随后坚定的支持我实现对 MySQL 数据库的支持,并给予了热心的帮助.
种子用户 C:
大客户,使产品真正实现了企业级的业务承载能力.
如果说是 A 用户催生了产品的诞生,达到能够投入使用的水平,那么 C 用户则真正帮助我把产品做到了企业级的水准.
在 C 用户上线使用时,我信心满满,毕竟已经有一些朋友都在使用我的升讯威在线客服系统了。而现实却与料想的情况完全不一样。 C 用户的同时在线客服数量超过 20 人,最高同时在线访客超过 1000 人,日均聊天消息超过 20000 条。系统第一次面临这样的大考,在很长一段时间里,又是各种救火…… 。
C 用户在完全投产前,也测试了一段时间,但随着切换过来的客服越来越多,访客越来越多,出现了一些奇怪且严重的故障。导致经常性需要手工重启服务才可解决,而我本机开发环境基本不能重现故障。 在这种情况下 C 用户与 A 用户一样,给予了极大的包容与耐心,一方面安抚客服,一方面全力协助我排查故障。这其中除了系统自身的问题,还有 APP 集成的问题、与 A 用户一样的网络不稳定问题等等。其中艰难略过不细说,最终使系统能够在高压力高并发环境下稳定运行,前后花了好几个月的时间.
如果没有 C 用户在这过程中的支持,我的在线客服系统很难有机会在这样真实的环境中得到验证,并解决问题,涅槃重生.
现在完全可以说,即使再有更多的客服在线,更多的访客,系统也可以从容应对.
最后安利一下我这个程序员业余肝出来的产品,在线使用和完整下载私有化部署都是免费的.
私有化版下载地址与版本说明: https://docs.shengxunwei.com/Post/f7bc8496-14ee-4a53-07b4-08d8e3da6269/553293a8-dfa1-4282-bc3f-96c6c623fc9a 。
最后此篇关于程序员做自己的产品“在线客服系统”之:种子用户的重要性的文章就讲到这里了,如果你想了解更多关于程序员做自己的产品“在线客服系统”之:种子用户的重要性的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Sequelize 中有没有办法添加另一列,然后用另一列的内容填充它? 最佳答案 您可以使用迁移来做到这一点。 就像是 queryInterface.addColumn( 'MyAwesomeTa
如何计算info_hash参数?又名对应于信息字典的哈希?? 来自官方规范: info_hash The 20 byte sha1 hash of the bencoded form of the i
是否可以直接从数据库或服务等将 URL 获取到 Nutch。我对从数据库或服务获取数据并将其写入 Seed.txt 的方式不感兴趣. 最佳答案 没有。这不能直接使用默认的 nutch 代码库来完成。需
MessageDigest 类实现了 SHA-1 算法(以及许多其他算法)。 SHA-1 算法允许使用不同的“种子”或初始摘要。参见 SHA-1 Psuedocode 算法初始化变量,或种子: Ini
我想创建一个应用程序,其中登录密码可以作为伪随机数生成器的种子以重新创建加密 key 。然后,该加密 key 将用于加密发送到应用程序数据库和从应用程序数据库发送的所有数据,使用户数据甚至主机都无法访
这个问题在这里已经有了答案: Recommended way to initialize srand? (15 个答案) 关闭 8 年前。 使用 srand(time(NULL))似乎过于确定性。例
我在获取要在我的自定义数据库初始值设定项上调用的 Seed 方法时遇到问题。我正在使用 EF 5.0 并具有以下代码: public static class MyDatabase { pub
是否可以像在 Rails 中那样“播种”数据库?我想将种子与图像对象管理器结合使用,以便我可以按标题获取记录。 最佳答案 根据您对 Ingo 的回答留下的评论,您想将 requireDefaultRe
我现在设置了一个应用程序来使用 EF6 代码优先迁移。我使用 Add-Migration 的标准工作流程,然后在控制台中使用 Update-Database。我在本地以及我们的开发环境中使用 Migr
如果 Name 返回然后删除 first name Name john Age 30 Name Alice Name Travis Age 12 Name Monty Name Hannah 期望的输
在迁移完成后,是否可以在我的迁移中放入一些东西来自动为表播种测试数据? 或者您必须单独播种? 最佳答案 您可以使用 --seed 选项调用 migrate:refresh 以在迁移完成后自动播种: p
我正在尝试使用不同的种子生成 scipy.stats.pareto.rvs(b, loc=0, scale=1, size=1)。 在 numpy 中,我们可以使用 numpy.random.seed
我的种子有问题。这是我的表结构: 1.Complaints: Schema::create('complaints', function (Blueprint $table) {
我在使用数据库初始化程序时遇到问题 - 从未调用过种子方法。类似的代码在另一个项目中工作,所以我很困惑为什么他们这次不工作。 这是我的代码: RecipeContext.cs public c
我正在尝试做一些我认为非常简单的事情,只需使用 RAND 创建 0-1 之间的随机数,并将其分配给十进制变量。但每次我在 MySQL 中运行代码时,它都会返回零! 参见下面的代码: DELIMITER
我有一个问题...... 这里我们得到了一个二维字节数组: byte[][] duengonMap = new byte[500][500]; 因为我想将它从客户端发送到服务器或者相反,我需要将其放入
我尝试在我的计算机上运行 Angular-seed(Windows 10,上次更新)https://github.com/angular/angular-seed 。网络工作正常,但我的 Protra
我有一个随机过程的分布式过程。因此,我使用 numpy.random.RandomState 来播种数字。问题是我必须在包装器中使用另一个 numpy.random 函数。现在我失去了种子的再现性,因
我需要确保我程序中的所有随机性都是完全可复制的。我应该在哪里调用 random.seed()? 我认为它应该在我的 main.py 模块中,但它导入了碰巧使用随机函数的其他模块。 我可以仔细浏览我的导
首先尝试使用 Entity Framework 和代码在 ASP.NET 网络应用程序中植入数据。我将这段代码放在 Configuration.cs 文件的 Seed() 方法中。现在,我正在处理解决
我是一名优秀的程序员,十分优秀!