- 博客(290)
- 资源 (5)
- 收藏
- 关注
原创 事件风暴(Event Storming)
事件风暴是一种集体讨论和可视化的方法,用于快速理解和建模复杂的业务领域。识别关键事件:通过集体讨论,识别出领域中的关键事件(Domain Events)。发现限界上下文:通过事件之间的关系,发现和定义限界上下文(Bounded Contexts)。定义领域模型:通过事件风暴,定义领域模型中的聚合(Aggregates)、命令(Commands)等DDD概念。促进团队协作:通过集体讨论,促进团队成员之间的沟通和协作,确保每个人都对领域模型有一致的理解。
2024-11-06 21:37:49
161
原创 限界上下文(Bounded Context)
限界上下文(Bounded Context)是指一个特定领域模型的明确边界。在这个边界内,领域模型的术语、规则和逻辑是一致的。明确边界:定义一个特定领域模型的边界,确保在这个边界内,领域模型的术语、规则和逻辑是一致的。避免冲突:通过明确边界,避免不同领域模型之间的冲突和混淆。促进协作:帮助团队成员更好地理解和协作,确保每个人都对领域模型有一致的理解。简化复杂性:通过将复杂的系统划分为多个限界上下文,简化系统的管理和维护。
2024-11-06 21:34:03
297
原创 领域事件(Domain Event)
领域事件(Domain Event)是领域模型中发生的重要事件的表示。这些事件通常代表了领域中的一些关键业务操作或状态变化。事件发生:领域事件表示领域中已经发生的事实,而不是未来的动作。不可变性:领域事件一旦发生,就不能被修改或撤销。解耦:领域事件通过发布和订阅机制解耦系统中的各个组件,使得各个组件可以独立开发和部署。异步处理:领域事件通常通过消息队列或事件总线异步处理,确保系统的高可用性和可扩展性。
2024-11-05 21:26:29
141
原创 仓库(Repository)
仓库(Repository)是一个设计模式,用于封装数据访问逻辑,提供一个高层的抽象,使得领域对象可以像操作内存中的集合一样操作持久化数据。封装数据访问逻辑:隐藏数据存储的细节,如数据库查询、事务管理等。提供集合类接口:提供类似于集合的操作方法,如添加、删除、查询等。保持领域模型的纯净:确保领域模型与数据存储细节分离,提高代码的可维护性和可测试性。
2024-11-05 21:22:39
173
原创 聚合(Aggregate)
聚合是由一个根实体(Root Entity)和其关联的对象(称为成员对象)组成的集合。根实体是聚合的入口点,外部对象只能通过根实体与聚合内的成员对象进行交互。聚合内的对象对外部是不可见的,这样可以确保聚合内部的状态保持一致。
2024-11-05 21:16:28
105
原创 值对象(Value Object)详解
值对象(Value Object)是领域驱动设计(Domain-Driven Design, DDD)中的一个重要概念,表示没有唯一标识符的对象。值对象的相等性基于其值而不是身份。这意味着两个值对象如果包含相同的值,则被认为是相等的。值对象通常用于表示不可变的数据结构,如地址、货币、日期等。
2024-11-04 23:05:12
256
原创 实体(Entity)详解
实体(Entity)是领域驱动设计(Domain-Driven Design, DDD)中的一个核心概念,表示具有唯一标识符的对象。实体的身份在整个生命周期中保持不变,即使其属性发生变化,实体仍然是同一个实体。实体主要用于表示那些在业务逻辑中需要跟踪和管理的对象。
2024-11-04 23:01:25
446
原创 领域(Domain)详解
领域(Domain)是指业务或问题所在的特定范围。它是业务逻辑和业务规则的核心部分,涵盖了企业的核心活动和目标。在软件开发中,领域通常是指那些需要计算机系统支持的业务领域,例如电商、金融、医疗、物流等。
2024-11-04 22:57:38
966
原创 领域驱动设计(Domain-Driven Design, DDD)入门指南
DDD强调通过深入理解业务领域,将复杂的业务逻辑与技术实现紧密结合,从而构建高质量的软件系统。领域驱动设计(DDD)是一种强大的软件开发方法,通过深入理解业务领域,将复杂的业务逻辑与技术实现紧密结合,从而构建高质量的软件系统。通过掌握DDD的核心概念、核心原则和实践方法,开发人员可以更好地应对复杂业务需求,提升系统的可维护性和可扩展性。每个微服务可以对应一个限界上下文,通过限界上下文的定义,可以确保每个微服务的职责明确、边界清晰。例如,地址是一个典型的值对象,两个地址如果内容相同,则认为是相同的值对象。
2024-11-04 22:53:29
429
原创 KMP算法、AC自动机算法的原理介绍以及Python实现
KMP算法要弄懂AC自动机算法,首先弄清楚KMP算法。这篇文章讲的很好:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html结合这篇文章,我说下我的理解比如如下查找,上面是原始串,下面是搜索串要从原始串中查找是否出现搜索串,现在已经查到ABCDAB...
2019-05-10 15:21:20
3060
原创 python项目“内存泄漏”的调试过程
现象:在压测的过程中,服务消耗的内存不断飙升,使用的内存大大超过了它可能消耗的内存大小首先是内存泄漏的几个可能原因:1、存在循环引用,gc不能释放;2、存在全局对象,该对象不断的变大,占据内存;3、使用了c或者c++扩展,扩展内存溢出了;1、首先检查代码,把代码中可能发生内存小泄漏的地方全部修改下、代码中没有调用c或者c++的扩展库2、查看下gc是否被禁止了i...
2019-04-29 09:56:01
6334
2
原创 服务超时实战分析
开发服务的时候,经常发现客户端超时的情况,但是从服务端的日志来看又都比较正常,下面是我项目中遇到的一些不同的超时情况。业务场景: 基于一段长文本,划出文本中的内链我主要遇到过如下三种场景的超时1、客户端query太长服务对这个query的处理消耗的时间比客户端设置的超时长,导致服务还没有把请求处理完毕,客户端就已经超时断开了当时调用方反馈了超时情况后,...
2019-04-29 09:46:57
2045
原创 不重启服务如何定时更新进程中的一个对象
场景: 主进程中初始化了一个对象(C++模块的对象,占用内存比较大,因为加载了一个很大的词表),然后启动子进程,并在子进程中使用这个对象,子进程对这个对象只读,不写 这个对象需要周期性的更新,因为要在对象中重新加载一些数据 如何不重启服务来更新这个对象呢?首先: 子进程因为不会对这个对象写,所以它们使用的其实跟主进程是同一个...
2019-03-01 10:30:46
1290
原创 Redis底部的几种存储结构(sds、dict、ziplist、intset、skiplist)
首先本文参考的是这个系列的文章:https://mp.weixin.qq.com/s?__biz=MzA4NTg1MjM0Mg==&mid=509777776&idx=1&sn=e56f24bdf2de7e25515fe9f25ef57557&mpshare=1&scene=1博主写的非常好,非常详细,我个人看完后,对核心部分进行了如下总结第一层...
2019-01-08 17:36:02
5110
3
原创 Redis慢日志问题解决
现象: 无线词条页访问失败问题分析:1、首先,查看日志日志中非常显眼的是,从Redis读取词条的pv耗时很长,高达20多秒, 看样子是访问Redis速度很慢导致2、查看Redis的慢日志> SLOWLOG GET可以得到如下结果:25) 1) (integer) 160 #日志的唯一标识符(uid) 2...
2018-12-10 16:53:32
2000
原创 写磁盘太慢导致服务超时问题分析
服务逻辑: 接收客户端的请求参数,写文件到本地磁盘 问题发现: 客户端报超时, 每天日志理论上是有几万条的,但是近几天只收到了几条 问题分析: 其实最开始的时候,以为是服务端处理不过来导致的,因为最开始服务端只有两个服务进程,后来增加了服务进程数,但是超时问题仍然没有得到解决 也怪自己没有做压力测试,如果做了压测,那么服务处理不过来的...
2018-12-10 12:11:43
2525
原创 tornado异步请求响应速度的实例测试
为什么要用异步处理?大部分Web应用(包括我们之前的例子)都是阻塞性质的,也就是说当一个请求被处理时,这个进程就会被挂起直至请求完成。在大多数情况下,Tornado处理的Web请求完成得足够快使得这个问题并不需要被关注。然而,对于那些需要一些时间来完成的操作(像大数据库的请求或外部API),这意味着应用程序被有效的锁定直至处理结束,很明显这在可扩展性上出现了问题。不过,Tornado给了我...
2018-12-06 18:53:17
2414
1
原创 scrapy自定义网页中图片的下载策略
自定义的初衷是:想修改保存文件的默认名称, 我们希望保留图片原始的文件名。 此外,scrapy图片的下载过滤策略是用了过期时间,可以通过在settings.py中配置如下参数来设置图片的过期时间:IMAGES_EXPIRES = 90但是对我们抓取百度百科的业务,一张图片如果已经抓取过,则不需要再重新抓取,所以这个是一次性的, 因为图片发生变化的可能性很小,所以没有必要做重复性的抓取...
2018-11-30 18:48:16
625
原创 scrapy自定义Request的缓存策略(减少内存占用)
scrapy-redis大概的架构:从redis中拉url,构造Request对象,写入SCHEDULER_QUEUE_CLASS定义的队列中,调度器从队列中拉取Request进行抓取想自定义Request的初衷主要是为了减少内存的占用,当然虽然我们的内存消耗的也不是那么多,也就几个Gscrapy自带的几个队列有这么几个:* scrapy_redis.queue.SpiderQu...
2018-11-30 11:01:23
2362
原创 scrapy中自定义过滤规则以及start_urls不进过滤器的问题
为什么要自定义过滤规则呢? 首先,我们需要过滤,但是不是说抓一次就不抓了,因为我们的抓取是一段时间抓取一次自定义策略如下:首先我试图直接继承RFPDupeFilter在settings.py同级的目录下新建dupefilter.py文件,按照网上说的方法,写了内容如下from scrapy.dupefilter import RFPDupeFilterimport hashli...
2018-11-29 19:22:10
3667
原创 请求方报超时,服务日志中记录的时间却少有超时
请求方报超时的比例大概有4%他们设置的超时时间是500ms但是我们统计日志,服务时间超过500ms的日志很少原因是什么呢? 超时原因分析:1、请求内容太长根据请求方超时日志, 大多数query的长度都是1w以上,这些query我手动请求,响应时间的确大于500ms, 在服务端还没有处理完的时候,客户端已经超时断开了2、等待时间太长客户端报超时的query,其中有...
2018-11-27 14:19:44
2343
原创 日志中每段代码执行时间的和不等于整段代码执行的总时间
代码逻辑:def getInlink() A -> B -> C -> D 在tornado中调用getInlink@tornado.gen.coroutine def get(self): start2 = int(time.time()*1000) error, errReason, lstS...
2018-11-22 10:10:21
438
原创 日志中每段代码执行时间的和不等于整段代码执行的总时间
代码逻辑:A -> B -> C -> D 实践中,分别记录了上面四个步骤执行的时间, 假设为At, Bt, Ct, Dt,并且记录了整个4步的时间,假设为ADt发现4个代码片段的时间的和不等于总的时间, 也就是: ADt > At+Bt+Ct+Dt 原因是什么呢?A->D这个步骤中应该还有CPU调度的等待时间,这...
2018-11-21 19:24:06
417
原创 压测中提高并发数后服务端处理时间增长的原因分析
后端逻辑: 接收请求、分词匹配、读redis做一些过滤策略在不断提高并发数的压测过程中,发现一个问题,后台服务对一个请求的处理时间也在增高, 而且增高的主要时间是消耗在读redis过滤那块过滤那块的主要逻辑是:从redis中读数据,并基于这些数据做一些过滤的策略为什么这块的耗时会增长呢?难道是redis的线程池不够用?导致有些redis的io请求要等待一会?应该不会,因为redi...
2018-11-20 15:02:35
2984
原创 两台机器实现QPS3000的服务优化
服务流程: 输入为一句话, 分词、匹配百科词条,读redis过滤、从redis读词条summary信息、返回需求: 业务方的峰值QPS为3000按照之前相关百科的一套逻辑: 单机tornado服务进程数4个模拟10个并发,压测的QPS为332, 响应时间为30ms$siege -c10 -r5000 -f urls.lstTransacti...
2018-11-16 19:41:18
2492
原创 一次Redis任务队列积压的问题分析与解决
目前的流程:两个Redis:Redis1: 存储词条的summary信息Redis2:任务队列,用于暂存Redis中没有summary,需要进行处理获取summary, 队列用的Redis的list结构两个进程:1、 进程1:服务进程接收请求,划内链词,然后从Redis1中去获取词的summary, 如果获取失败,则返回code=4的错误,并将词条id写入任务队...
2018-11-16 11:32:32
6190
原创 tf.layers.conv1d函数解析(一维卷积)
一维卷积一般用于处理文本,所以输入一般是一段长文本,就是词的列表函数定义如下:tf.layers.conv1d(inputs,filters,kernel_size,strides=1,padding='valid',data_format='channels_last',dilation_rate=1,activation=None,use_bias=True,...
2018-11-14 15:09:10
52934
17
原创 二维卷积神经网络的结构理解
针对这个图,我们对应着卷积的api函数来说:tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)如上图:第一列为一张输入图像, 大小为7*7*3, 即宽高为7*7, 通道数为3所以inputs的维度就是: [-1, 7, 7, 3] , -1是表示batch的大小可以...
2018-11-14 15:07:13
6492
原创 个人对stacking的思想理解
主要分为几个基础模型,一个元模型对于基础模型,采用K折交叉的方式来采样数据,并分别进行训练,这样对于每个模型,都会用K组采样数据来进行训练,从而得到K个不同的模型版本假设现在基础模型有KNN,SVM, 那么对基础模型训练后会得到如下几个模型:KNN_model1, KNN_model2....KNN_modelKSVM_model1, SVM_model2....SVM_model...
2018-11-14 15:05:50
671
原创 preprocessing.StandardScaler中fit、fit_transform、transform的区别
1、fit用于计算训练数据的均值和方差, 后面就会用均值和方差来转换训练数据 2、fit_transform不仅计算训练数据的均值和方差,还会基于计算出来的均值和方差来转换训练数据,从而把数据转换成标准的正太分布 3、transform很显然,它只是进行转换,只是把训练数据转换成标准的正态分布 一般使用方法:a) 先用fitscaler = prepro...
2018-11-14 15:04:15
33013
8
原创 sklearn相关积累
sklearn的参考教程:https://morvanzhou.github.io/tutorials/machine-learning/sklearn/3-5-save/ 1、 解决的问题分类、回归、聚类和特征降维sklearn中有很多数据库可以用来练习 2、交叉验证: cross_val_score作用:用来评估模型的准确性,基于准确性,选择最好的模型。优势...
2018-11-14 15:02:54
473
原创 机器学习中遇到的问题
1、ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory找不到so库文件用自己的账户运行包会报上面的错误,但是用root账户运行却没有问题原因:root账户里面的LD_LIBRARY_PATH路径能找到这个so文件,但是自己的账户的LD_LIBRARY_PATH路...
2018-11-14 14:59:29
2406
1
原创 客户端请求时间和服务端处理时间不匹配问题
现象: 客户端日志,调一个接口耗时为2-3s 服务端日志,处理一个请求耗时只有100-200ms问题: 这明显速度不匹配, 理论上差不了太多才对分析原因: 可能是服务端处理不过来,虽然一个请求服务端处理的时间很短,但是客户端请求响应的时间主要是消耗在等待被处理上目前客户端的进程数是25, 服务端的服务进程数是2....
2018-11-14 14:54:26
4939
原创 ab测试post如何用文件提交json格式的参数
在网上找了很多方法都失败首先我的参数是这样的:服务端需要一个名称为data的参数值为:"{'title': "刘德华"}", 即值是一个json格式的字符串错误方法:ab -n10000 -c10 -T application/json -p post.json http://10.134.75.38:1234/find/lemma/categorypost.json的...
2018-08-28 15:56:06
6074
原创 用Docker容器自带的tensorflow serving部署模型对外服务(成功率100%)
前传:相信很多人和我一样,在试图安装tensorflow serving的时候,翻遍了网上的博客和官网文档,安装都是以失败而告终,我也是一样,这个问题折磨了我两个星期之久,都快放弃了。幸运的是在同事的建议下,我采用了一种迂回的策略安装成功了。我们采用的策略是: pull一个已经安装好了tensorflow serving的docker镜像,替换它自带的一些模型为我们...
2018-08-27 10:36:36
15760
13
转载 机器学习算法实践-SVM中的SMO算法
前言前两篇关于SVM的文章分别总结了SVM基本原理和核函数以及软间隔原理,本文我们就针对前面推导出的SVM对偶问题的一种高效的优化方法-序列最小优化算法(Sequential Minimal Optimization, SMO)的原理进行总结并进行相应的Python实现。坐标上升算法(Coordinate Ascent)在SMO算法之前,还是需要总结下坐标上升算法,因为SMO算法的...
2018-07-27 10:59:31
2145
转载 KKT条件
KKT条件介绍 最近学习的时候用到了最优化理论,但是我没有多少这方面的理论基础。于是翻了很多大神的博客把容易理解的内容记载到这篇博客中。因此这是篇汇总博客,不算是全部原创,但是基础理论,应该也都差不多吧。因才疏学浅,有纰漏的地方恳请指出。 KKT条件是解决最优化问题的时用到的一种方法。我们这里提到的最优化问题通常是指对于给定的某一函数,求其在指定作用域上的全局最小值。...
2018-07-27 10:29:02
7067
转载 dropout为什么有效
开篇明义,dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。dropout是CNN中防止过拟合提高效果的一个大杀器,但对于其为何有效,却众说纷纭。在下读到两篇代表性的论文,代表两种不同的观点,特此分享给大家。组合派参考文献中第一篇中的观点,Hinto...
2018-07-06 16:03:58
1931
转载 MLP多层感知机(人工神经网络)原理及代码实现
一、多层感知机(MLP)原理简介多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN,Artificial Neural Network),除了输入输出层,它中间可以有多个隐层,最简单的MLP只含一个隐层,即三层的结构,如下图:从上图可以看到,多层感知机层与层之间是全连接的(全连接的意思就是:上一层的任何一个神经元与下一层的所有神经元都有连接)。多层感知机最底层...
2018-07-05 11:23:19
87440
3
apache+php+mysql的嵌入式移植详细过程
2013-09-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人