- 博客(243)
- 资源 (19)
- 收藏
- 关注
原创 JPA编程,group分组配合max函数实现数据的去重并排序
有一个数据库表Like,存储的是用户推荐材料的记录, 有以下字段:一个用户可以推荐多个材料,反之,一个材料也能为多个用户推荐。在展示推荐列表的时候,需要按浏览次数排序进行排列。所以本表冗余存储了浏览次数字段, 按推荐表的常规设计,只需要用户ID+材料编号两个字段即可。有一个需求点是:不能重复展示推荐表中的材料,因为浏览次数最多的材料,当被多个用户推荐时,本表会存储多条记录。查询数据,见下图:对于材料6325868f67bf41438d62cf20ade464e8,它的浏览次数是17,被多个人推荐,所
2025-04-01 09:49:38
297
原创 Rabbitmq消息被消费时抛异常,进入Unacked 状态,进而导致消费者不断尝试消费(下)
消息在消费的时候,如果出现异常,直接抛弃,不想进入重试流程。回到最上面的流程图,其实还是无法解决消息消费失败的死循环。虽然不会进入重试, 但是在消费消息的时候,由于抛异常,又会进入消息队列。最终导致死循环。解决方法是: 对于不想要重试,而又不陷入死循环。那么就只有一个办法,使用个大大的try-catch住消息监听方法。
2025-03-25 13:51:25
1070
原创 Rabbitmq消息被消费时抛异常,进入Unacked 状态,进而导致消费者不断尝试消费(上)
在对阿里云成本分析的时候,发现SLS日志的费用暴增,由平均每月的2000元突然增至6000多。查看日志的费用明细,按应收金额降序得知,原来是某个java服务打印的jvm日志暴增。再已进入SLS查看打印的日志量,更是惊呆了。。。不仅是打印的数量多,打印的时间点是遍布整天24小时。也就是说,该日志是整天整夜地打印,像是进入了死循环。围绕着这个问题,尝试让AI给我回答原因是什么。可能是我提问水平不够,未能准确得出答案,在排查这个问题的过程中,代码是一分钟就定位出。
2025-03-25 13:47:55
1116
原创 微信小程序的业务域名配置(通过ingress网关的注解)
是依靠kong实现,本文将通过ingress网关实现。而我们的服务是部署于阿里云K8S容器,当然内核与ingress无异。找到k8s–>网络–>路由。
2025-03-20 17:05:08
506
原创 Java对接豆包等AI大模型的设计方案(六)-- 对接OpenAI的java库
请求和响应的POJO类,包括com.theokanning.openai.completion.chat.ChatMessage(请求上下文消息),com.theokanning.openai.completion.CompletionResult(正常响应体),com.theokanning.openai.OpenAiError(处理错误异常)这个jar包复用性比较高,除了多模态上下文,无法直接使用ChatMessage外。
2025-03-19 15:04:24
545
原创 Java对接豆包等AI大模型的设计方案(五)-- 编程实现(下)
接着上文,我们将通过监听者SseEventSourceListener实现SseEmitter与okhttp请求的串联。为了做到二者的关联,在SseEventSourceListener对象构造的时候,便把SseEmitter对象传递进去。实现onEvent()方法如果你也需要解析并保存data中的数据,给一个参考实现。
2025-03-19 09:15:00
854
原创 Java对接豆包等AI大模型的设计方案(四)-- 编程实现(上)
返回体是一个SseEmitter,它继承ResponseBodyEmitter,同属于spring-webmvc模块。方法send()负责传输数据给客户端方法complete()告知客户端断开连接,终止传输@ApiOperation(value = "AI问答")@ApiModel@Data@Builder@ApiModelProperty(notes = "会话ID", required = true)@NotNull(message = "会话ID必填")
2025-03-18 09:21:35
832
原创 Java对接豆包等AI大模型的设计方案(三)-- 概要设计(下)
chat作为会话聊天室,每次的一问一答则是chatItem会话明细,它们是一对多的关系。这本身没有什么难点,想着重说明的是,我们把操作本地数据库表与调用AI大模型分离开来。总是先操作chat和chatItem,把提问内容保存好,再向第三方AI大模型发起http请求。等待AI大模型返回数据后,再更新chat和chatItem的回复字段。这里会遇到一个问题:在遇到网络或账号等异常时,导致AI大模型返回报错信息,此时的chatItem会话明细会出现空回复的异常。
2025-03-18 08:37:42
373
原创 Java对接豆包等AI大模型的设计方案(二)-- 概要设计(上)
这是以kimi为示例,在实际业务中,我们会让业务方在创建会话聊天室的时候,传入提问的内容。如果用户没有开始发起提问,也就无需创建会话聊天室了。点击“开启新会话”,就是创建了一个聊天室。换句话说,一个会话聊天室,必须有一个提问。这里解释下什么是重问AI。
2025-03-17 16:02:34
526
原创 Java对接豆包等AI大模型的设计方案(一)-- 需求分析
接下来几篇文章,我试着从需求分析、概要设计到编程实现等角度,梳理并总结java语言是如何对接豆包等AI大模型。本文作为对接AI的第一篇文章,先从需求着手,讲一讲在小公司是如何使用AI大模型。不同的业务在需要问AI的时候,调用ai-assist服务,创建一个聊天会话。在聊天会话中,支持发送文字及图片,也即多模态上下文。AI回复的内容需要保存至本地数据库,留待用户回看。
2025-03-17 15:40:40
419
原创 kong搭建一套微信小程序的公司研发环境
本文通过图文的方式,把微信小程序的公司研发环境搭建整过程详细描述,使用到的api网关是kong。如果是其他网关,原理大同,见文章最开头的架构图。另外,你需要知道公司研发环境的网络相关知识,比如外网和内网的端口映射应该如何做。
2025-03-14 10:23:39
2205
原创 es查询报错Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]
es查询报错:Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]
2025-03-11 20:25:25
235
原创 JPA编程,去重查询ES索引中的字段,对已有数据的去重过滤,而非全部字典数据
课程管理界面,查询前,需要把查询元数据给出。学科列表、学段列表和分类列表,我们把它定义为查询元数据。一般的业务需求是:系统维护好多个字典,比如学科、学段等等,相当于属性库。但是,这有一个不友好的地方,字典列表数据过多,比如学段字典包括了幼儿园和大学等,而实际上,课程只有初中或高中,连小学学段也没有。这样展示的学段列表,就显得数据冗余,增加选择的干扰。修改后的需求:基于已有课程的属性,进行去重查询出学科列表等数据,也即上文提到的查询元数据。(已非原始字典)
2025-03-06 11:12:15
2257
原创 JPA编程,批量统计每个课程下的讲次数,编写自定义SQL查询语句
在查询课程列表的时候,需要统计每个课程下的讲次数。一般,我们是不建议把讲次总数冗余存储于课程里,而是采用实时查询统计的方式展示。课程与讲次的关系是一对多。本文主要是通过Jpa编程实现批量查询每个课程下的讲次数。先介绍讲次的实体,然后是持久层,最后是service层的使用。
2025-03-06 10:15:39
520
原创 微信小程序的业务域名配置(通过kong网关的pre-function配置)
本文并没有按传统的做法,把校验文件放在文件服务上,而是通过kong网关的插件,对访问接口做了一个预处理。
2025-02-10 17:38:48
241
原创 说一说mongodb组合索引的匹配规则
有一张1000多万条记录的大表,需要做归档至历史表,出现了大量慢查询。查询条件是耗时近5秒,且是全表扫描为什么没有使用到任何索引呢?请看该集合创建的索引有哪些:建立了两个组合索引userId_1_classroomId_1_isDelete_1和userId_1_classroomId_1,但是二者的重复度极高。(可以删掉userId_1_classroomId_1_isDelete_1,再新建一个单索引classroomId_1)
2025-01-13 10:52:52
1294
原创 xxl-job回调执行器,发生NPE空指针异常
问题找到了,其解决办法就简单了:让xxl-job-core和xxl-job-admin的版本保持一致。
2025-01-08 22:54:02
536
原创 微服务框架,Http异步编程中,如何保证数据的最终一致性
异步编程,要求数据的一致性,往往采取的是最终一致性。意味着在绝大多数情况下,实时回调可以保证数据更新的及时性,少数以及异常情况下,通过主动查询可以保证数据的最终一致性。本案例中,主要是回调的速度快于本地数据库的入库,所以问题是少见的,一般也很难排查。
2025-01-06 15:08:22
742
原创 json报文的序列化与反序列化问题总结(对比fastjson和jackson)
通过上面代码的运行结果可以得知,fastjson在处理带反斜杠的json字符串时,兼容性比jackson要强。
2025-01-06 11:31:33
550
原创 Java程序设计,使用属性的选项库,轻松实现商品检索的复杂查询(下)
文章到此,关于商品检索的复杂查询就全部完成。还是那句话,这里的设计思路,不仅限于商品,可谓是打开业务设计的万能钥匙。对于提高程序的鲁棒性非常有帮助,微服务设计中的CQRS以及数据重构,绕开了关系型数据库的多表查询,又使用到关系型数据库的事务机制。程序设计得更加抽象且通用,而不是跟着需求打转,变动大且提测周期长。顺便说一句,除本文提及的方案外,还有一种更简的方案。去掉类目领域,只使用属性及选项即可。如果是课程领域,那么就是这么几张表搞定。
2024-12-25 11:14:45
544
原创 Java程序设计,使用属性的选项库,轻松实现商品检索的复杂查询(中)
再次声明,使用属性及选项实现高效检索,不仅仅适用于商品业务模型,像课程、任务、用户等领域都适用。另外,这里说检索的高效,不单指检索速度,而是指代码的健壮性,适应业务需求的灵活与多变。这里以课程举例:课程常见的属性有科目和年级,哪天业务需求方又想要增加按课程分类过滤,常规设计是在课程基础信息表增加一个字段叫课程分类,涉及课程的增删改查统统增加该字段。(数模变更、接口变更、提测并上线)可以说,常规设计,应付这个简单的需求变化,是很容易。但是代码变更的地方多,伤害性不大,影响范围大,上线流程长。
2024-12-25 11:09:13
509
原创 Java程序设计,使用属性的选项库,轻松实现商品检索的复杂查询(上)
本文我们以某商城的商品检索为例,说一说如何使用属性及选项,实现复杂的逻辑表达式的查询。先贴图,总结出业务需求。可以通过一系列属性及选项的组合,过滤出用户想要的商品列表。
2024-12-25 11:03:22
603
原创 kong网关使用pre-function插件,改写接口的返回数据
总之,kong的这款pre-function插件可以适用于许多场景,好处是灵活配置,支持lua脚本。当然,它只返回相对固定的报文,除非你使用Lua脚本去连接数据存储中间件。不过,对于简单的一些场景够用了,这也提醒我们一点,在客户端请求接口的时候,尽量把一些标识性的字段通过http header上传上来。比如schoolId 、 userId、 deviceId、ip等等,后期在kong网关便于读取并判断是否拦截请求。
2024-12-24 13:37:20
758
原创 记一次因误删mongodb索引,而导致集群数据库的内存飙升和锁数量剧增的生产事故(下)
在MongoDB数据库中,currentOp是一个命令,用于返回当前数据库实例中正在执行的操作的信息。这个命令可以帮助用户诊断性能问题和识别长时间运行的操作。client:请求由哪个客户端发起。opid:操作的ID,可以通过db.killOp(opid)终止该操作。secs_running/microsecs_running:代表请求运行的时间,如果这个值特别大,需要检查请求是否合理。query/ns:可以看出是对哪个集合正在执行什么操作。lock*:与锁相关的参数。
2024-12-17 12:33:47
972
原创 记一次因误删mongodb索引,而导致集群数据库的内存飙升和锁数量剧增的生产事故(中)
先说一说我们的排查思路,在其他业务没有显著剧增的情况下,我们很容易定位出嫌疑最大的后端服务。于是,我们尝试在外网网关,把该服务关闭,不让外网域名访问进来。第二步,让mongodb缓口气,坐等其性能好转。预期把这个服务停掉之后,数据库就会好转。但是,事与愿违,数据库的性能指标并没有显著变化,cpu和内存还是跟过山车一样,下降了又上升,上升了又下降,循环往复。期间,为了让嫌疑服务不访问数据库,还尝试把节点数由6个降低至1个,当然也使用了重启大法。
2024-12-17 11:30:09
869
原创 记一次因误删mongodb索引,而导致集群数据库的内存飙升和锁数量剧增的生产事故(上)
本文欲梳理一次mongodb的生产事故,在不确定事故起因的情况下,我们从早上六七点,一直到中午才定位出问题。持续时间之长,不可谓不是一次惨痛的教训。首先,我们是第一时间收到了Mongodb数据库监控告警的信息,体现最明显的是cpu使用率达到了100%。(遗漏了其他信息,或者说不同于以往的指标,待下文细说)其次,客户端应用反馈说后端响应巨慢,无法访问。说明后端服务挂了,此时再使用应用重启这一大招也不好使。基于这两点,我们无法排查并定位出问题,因为此mongodb数据库集群是一批应用共用。
2024-12-17 11:25:15
315
原创 对接浦发银行支付(十四)-- 支付回调接口,未收到回调或验签出错
这一篇,我们再次梳理下支付回调的相关注意事项。另外回调报文解密后,在验签的时候,浦发外调RSA公钥内容不要写错了,具体注意事项见后文。
2024-12-15 10:49:13
109
原创 Undertow容器线程池配置及监控
选取一个java应用,看一看它的线程池,主要是工作线程worker-threads的值。默认线程池大小是如何的呢?从阿里云arms监控的线程池,可以看到,核心线程数默认是CPU核数 * 8所以线程池的最大线程数为3 * 8 = 24上图中,在12月04日 17点45分时,活跃线程数达到极大值–24,剩下的75个请求自然就在队列中等待了。在高并发的业务场景下,需要上调工作线程值。
2024-12-09 10:03:38
776
原创 对接浦发银行支付(十三)-- 接口对接前的准备,IP白名单
当浦发开放平台的API接口申请通过后,也得到了浦发商户的商户号和终端号。接下来,我们开始发起API接口,第一个接口当然是支付请求下单。这个错误的原因是,浦发银行需对请求方的IP地址进行管控,也就是要我们把出口IP登记给对方。下面就说一说,具体是有哪些IP地址登记。(难道有好几个地方?是的,避免你少走弯路,这里一一陈述出来)
2024-12-02 13:20:32
182
原创 Nexus搭建go私有仓库,加速下载go依赖包
本文我们梳理一下go依赖包的私库搭建以及使用。它只分为proxy和group两种仓库,这一点和maven仓库有所不同。
2024-11-22 15:24:19
902
原创 Java编程,配置mongoUri连接mongodb时,需对特殊字符进行转义
感叹号这样的特殊字符,它的转义方式则是反斜杠。否则java程序在解析uri的时候,会提前截取到第一个@,把前半部分错认为数据库的密码。比较是在内网环境下,不对外网访问的情况下,密码相对安全即可。有时候,为了安全性,dba会设置比较复杂的密码,含有特殊字符,比如@符号等。当使用uri方式连接mongodb时,对特殊符号,特别是@符号,进行转义。遇到特殊字符的时候多留个心眼,设置数据库密码的时候,不要太复杂了哈。但是,如果使用方式二(uri)连接,则需要对@符号转义为%40。以用户数据库为例,注意看它的密码。
2024-11-22 10:22:51
1271
原创 Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
本文的内容比较长,既描述了阿里云对mongodb数据库的监控(着重是连接数指标),以及Mongos的使用及购买的坑,也从Java语言的 Mongo驱动程序作为切入点,分析并总结了支持哪些数据库连接池的配置项。本案例是基于生产实际中遇到的一个棘手问题,希望可以帮助到你。通过本文,让我们对连接数这个指标有更深的体会,它是一个很冷的指标,却非常致命。说它致命,是说我们在遇到程序报错的时候,极容易陷入平常思维,以为是有慢查询,或者程序QPS过高导致程序挂了。
2024-11-20 10:45:40
1311
原创 kubepi管理k8s集群,演示如何连接阿里云k8s容器
对k8s容器运维的过程中,如果是自建k8s的话,一般会安装dashboard,方便管理;如果是阿里云k8s容器,它是有提供web ui,但是它有个不便之处–需要定期登录,且缺少命令控制台。当你需要使用命令控制台时,阿里云会建议你安装kubectl本文推荐一款k8s管理工具–kubepi,它可以方便地管理多个k8s集群,不仅提供kubectl命令控制台,还有web UI。下面将介绍如何使用Kubepi连接阿里云k8s容器。
2024-11-19 09:52:38
616
原创 jenkins用户在执行scp的时候如何做免密登录
在jenkins job中执行scp的shell命令,当然不希望每次输入密码,另外处于出于安全考虑,也不建议在scp命令中指定。所以,我们需要对远程机器进行免密登录。本文遇到的问题是,在jenkins机器上执行scp已做到了免密,无需输入密码;但是,在jenkins job中执行scp命令,却报错Permission denied, please try again.
2024-11-15 17:18:14
891
原创 对接浦发银行支付(十二)-- 浦发开放平台的操作说明
填写你的app中英文及备注,没有要求。提交后,将会生成好你的APP,注意查收你的邮箱。将会收到这么一个邮件。这里的提示很nice,明确告诉了我们,下一步以及下下一步要做什么。
2024-11-15 15:23:34
104
原创 spring-data-elasticsearch 3.2.4 实现桶bucket排序去重,实现指定字段的聚合搜索
在搜索的时候,搜索条件包括creatorId列表,grade列表,subject列表等,且它们不是固定的字典,而是从文档CourseIndex的已有数据中获取。
2024-11-15 10:02:46
1013
原创 linux多IP地址环境下,java读取本机实际的IP地址
可以看到,本机有许多IP地址,还未许多未截取。而实际的IP是192.168.8.28所以我们在读取本机IP的时候,需要去掉无效的IP。因为本机安装了docker导致生成了许多虚拟网段的IP。
2024-11-05 16:25:42
448
原创 jfrog artifactory oss社区版,不支持php composer私库
安装环境:centos操作系统,root用户。如果是mac或ubuntu等操作系统的话,会有许多安装的坑等着你。一切都是徒劳,安装折腾那么久,最后还是不能使用。这就是写本文的初衷,切勿入坑就对了。
2024-11-05 14:48:36
934
原创 本地搭建php包依赖管理工具,使用satis搭建私有composer仓库
具体应用的配置,一般都是保存在路径/etc/nginx/conf.d。下一步,我们将进入/opt/satis_manage,查看其配置。浏览器访问http://{ip} 默认80端口。根据进程号,进一步查看进程启动命令。manage 是一个可执行应用程序。端口8081对应的进程号是1342。也即satis_manage。
2024-10-31 10:39:15
717
浦发银行支付api对接
2024-04-21
Software-Transactional-Memory.pptx
2019-06-14
MyDac 7.0.1 ODAC 8.0.1 for Delphi 7 / 2010 Delphi XE2
2015-03-13
Packet.Tracer5.2.0.0068-汉化包
2010-07-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人