- 博客(153)
- 问答 (1)
- 收藏
- 关注
原创 【Redis】处理客户端指令
9. key_step:key的“步长”,比如MSET的key_step是2,因为它的参数是key,val,key,val这样的形式。【log】networking.c addReply() 设置响应,响应在内存中的地址时 c->buf+c->sentlen。【log】networking.c acceptTcpHandler() 处理客户端tcp连接。redis-server处理命令时要执行的函数。【log】networking.c readQueryFromClient() 请求处理。
2023-02-08 22:44:34
139
原创 【Redis】IO多路复用 epoll/select/kqueue/evport
9. key_step:key的“步长”,比如MSET的key_step是2,因为它的参数是key,val,key,val这样的形式。6. get_keys_proc:可选函数,当下面三个项不能指定哪些参数是key时使用。4. sflags:命令标志,标识命令的类型(read/write/admin…3. arity:命令的参数个数,如果是-N代表大于等于N。7. first_key_index:第一个是key的参数。8. last_key_index:最后一个是key的参数。1. name:命令的名称。
2023-02-08 22:41:30
15859
原创 【Elasticsearch】分片和副本 allocation
ExistingShardsAllocator.UnassignedAllocationHandler.initialize() -> 判断前面主、副未分配shard经过各自的 决策器返回 YES,则修改 shard 的状态,由 unassigend(未分配) 改为 initalizer(初始化)。AllocationService.reroute() => 开始 reroute 流程,判断集群状态中记录的所有index的shard是否有未分配的,并判断是否能进行某个节点分配。
2023-02-08 22:36:06
648
原创 【Elasticsearch】模块管理 Guice
通过上面的绑定,在后续调用 Injector.getInstance(clazz) 可以直接获取到目标实例,比如 GatewayAllocator.class 这个服务,Guice 在创建这个服务对象(asEagerSingleton标记为单例)时同时会注入依赖,而依赖是通过 @Inject 注解标注的,Guice 也正是识别这个注解来自动注入下来。容器存在的意义主要是实现依赖注入,也就是通过容器获取一个目标类的对象时,这个对象依赖的其他对象能够自动注入然后拼装成最终的我们需要的对象进行返回。
2023-02-08 22:32:25
495
原创 【Elasticsearch】网络模块 transport
集群通信TCP客户端处理器,会调用 openConnection() 建立连接,也就是调用前面的 Netty4Transport.initiateChannel() 定义的各个TCP处理器用于集群通信。TransportNodesInfoAction.execute() => 该类没有实现 execute(),会调用父类的 execute(),所以想要知道一个 TransportAction 子类的功能只需要关注他的 execute() 或者 doExecute() 方法即可。
2023-02-08 22:23:38
953
原创 【Elasticsearch】raft 选举
不,现在的做法不再记录“quorum” 的具体数值,取而代之的是记录一个节点列表,这个列表中保存所有具备 master 资格的节点(有些情况下不是这样,例如集群原本只有1个节点,当增加到2个的时候,这个列表维持不变,因为如果变成2,当集群任意节点离线,都会导致无法选主。5.同理, 节点收到 Master 节点发来的集群状态 ,在处理二段提交的第二阶段: CoordinationState::handleCommit 中,如果 clusterState中的 term 不等于当前 term,则拒绝该请求。
2023-02-08 22:20:57
430
原创 x265 windwos使用wsl调试
/ 该模块使用的函数和编码模块是一样的。* planar格式,先连续存储所有像素点的Y分量,紧接着存储所有像素点的U,随后存储所有像素点的V。std::cout
2023-02-02 11:18:16
210
原创 【Hotspot】clion调试 openjdk
ubuntu20比较新, 编译openjdk8需要安装老版本的编译工具。在编译 openjdk 时还需要一个 jdk 环境用以引导。1.下载oracle-jdk8。2.下载openjdk8源码。配置多版本gcc控制。
2023-01-30 21:38:44
721
原创 h264编码算法流程
这里指的场景切换是指场景1切换到场景2,而后后切换回场景1,视频里面的场景大部分是来回切换小部分是一直切换新场景,那么在编码器检测到场景切换后就会检测当前缓存是否有当前场景比较相近的长期参考帧,找出来用它作为运动估计的参考。注意上面都是亮度预测,8*8用于色度预测,色度的Cr和Cb分量的预测模式选择是一样的。在结果变换和量化之后,需要进行游程编码,由于标准支持了 4*4、8*8等变换,以及对一些预测方式的直流分量进行了哈达玛变换,一共有13种块类型,不同的快类型游程编码的扫描系数不同。
2022-11-15 14:31:11
2862
1
原创 视频编码全流程
每一帧图像,划分成一个个块来进行编码的,这一个个块在 H264 中叫做宏块,宏块大小一般是16x16(H264、VP8),32x32(H265、VP9),64x64(H265、VP9、AV1),128x128(AV1)这几种。一个图像一个帧内,每16*16作为一个字块,相邻的字块之间有较强的相关性和相似性。另外同一个 16*16 的小块内基本上每个像素点的颜色是一样的可以减少编码数据量。
2022-11-14 15:03:31
3133
原创 【Elasticsearch】elasticsearch 优化
添加一条documentPUT /test_index/test_type/1{ "test_content":"test test"}#查询GET /test_index/test_type/1#返回{ "_index" : "test_index", "_type" : "test_type", "_id" : "1", "_version" : 2, "found" : true, "_source" : { "test_content" : "test test" }}
2022-11-09 23:14:44
728
原创 【Elasticsearch】开发 packet-beat 插件
Elastic 的 beat 家族有很多著名的产品比如 filebeat、packetbeat 等,都支持扩展开发,项目使用 go 语言,这里演示开发环境的搭建。
2022-11-09 23:14:11
886
原创 【Thingsboard】使用技巧:自动维护关联关系
自动创建关联关系,从当前消息实体出发创建指定的关联关系。通过监听服务端属性的变更,从当前消息实体和目标实体之间创建关联关系。这里从指的是"从目标实体"。
2022-11-08 09:06:53
507
原创 【Thingsboard】使用技巧:聚合计算定时任务
专业版的 aggregate latest 节点可以定期聚合A下面子设备(BCD)的数据,然后切换到A身份输出为每个父实体和聚合属性生成POST_TELEMETRY_REQUEST类型的消息。
2022-11-08 09:06:45
688
原创 【Thingsboard】使用技巧:直接调用规则引擎
很多时候,厂家不太需要 Thingsboard 的功能,而只想单独使用规则引擎的快速发开能力,那么可以通过直接调用规则链的方式来实现。
2022-11-08 09:06:06
525
原创 【Thingsboard】使用技巧:测试数据生成节点
很多时候会判断一个设备的经纬度是否有在某个地域内,或者判断两个设备之间的经纬度是否相隔太远,则可以使用电子围栏的规则节点来完成相应的需求。
2022-11-08 09:05:56
711
原创 【Thingsboard】源码分析:下行 rpc 调用
log.info("[日志][ DefaultTbCoreDeviceRpcService -> processRpcResponseFromDeviceActor ]rpc2w响应处理");请求由 DeviceActor 发送出去后,transport会发送响应到队列里,队列服务获取到响应后同样是先给 tbCore。# deviceActor 将响应发送给 tb-core, tb-core 将响应发送给 rule-engine。# DeviceActor处理最终的rpc请求。
2022-11-07 09:14:14
811
原创 【Thingsboard】源码分析:设备网关api 分析
然后构造子设备的会话对象 GatewayDeviceSessionCtx,这个对象是 SessionListener 实现类用于子设备接受平台的回调。然后将子设备的会话加入到当前网关处理对象的缓存中,后续需要通过 deviceName 获取出子设备会话对象进行属性上传。:平台下行rpc到子设备。会调用子设备会话校验,检测缓存对象中是否有该 deviceName 的子设备会话对象,如果没有的话则执行上面的子设备会话初始化,如果存在缓存中则直接取出子设备的 deviceInfo 进行消息上传。
2022-11-07 09:13:59
403
原创 【Thingsboard】源码分析:数据 dao 层
AccountController(路径:application,包:org.thingsboard.server.controller)所有的 sql 语句都写在 org.thingsboard.server.dao.sql 包下面,里面有所有实体的查询语句。所有的实体类都通过 Table 注解,在 org.thingsboard.server.dao.model.sql 下。新增 Account(文件:common,包:org.thingsboard.server.common.data.
2022-11-07 09:13:50
417
原创 【Thingsboard】源码分析:实现 Actor 系统
这三个动作没有固定的顺序,可以并发地执行,Actor会根据接收到的消息进行不同的处理。3、接下来会创建一个根Actor(org.thingsboard.server.actors.app.AppActor),并将其设置为Actor系统的根Actor,这个Actor是所有消息的入口,是其他所有Actor的Parent。6、第一次收到消息的时候会先进行TenantActor的初始化,从数据库的tenant表里面拿出所有的数据,并进行加载,每一个Tenant都会创建对应一个TenantActor。
2022-11-07 09:13:33
680
原创 【Thingsboard】源码分析:设备创建链接和断开链接
INFO ContextAwareActor - [日志][ ContextAwareActor -> process ]msg=TransportToDeviceActorMsgWrapper(tenantId=06e29f90-5bbb-11ec-b8c3-5164aa3a5bca, deviceId=a7e8e080-7762-11ec-ab81-811f614b3583, msg=sessionInfo {
2022-11-07 09:13:10
385
原创 【Thingsboard】源码分析:设备活跃和心跳分析
加上设备允许最大不活跃时间间隔(600000) 】 相比 【当前时间(1646059574864) 】谁大,如果前者大说明还在设备允许的不活跃时间间隔内,设置 active=true,如果后者大说明设备允许的最大不活跃时间间隔已经过了,设置 active=false。log.info("【日志】 当前时间="+ts+",上次活跃时间="+state.getLastActivityTime() + ",允许最大不活跃时间间隔=" +state.getInactivityTimeout());
2022-11-07 09:12:54
844
原创 【Thingsboard】源码分析:社区办和专业版的权限控制
也就是说,想要做到数据权限的前提就是所有的实体表(包括用户表)都必须冗余 tenant_id 和 customer_id 这两个字段,这样 SecurityUser 中取出当前用户的 tenant_id 和 customer_id 再和需要进行 curd 的实体的 tenant_id 和 customer_id 进。这个是用户所属层级上面的粗粒度的接口校验。数据权限 CE 和 PE 版本都有,CE 版本仅仅校验当前用户对需要访问的目标资源有没有访问权限(比如A租户不能看到B租户下面的东西)。
2022-11-07 09:10:04
1000
原创 【Thingsboard】源码分析:Websocket 和前端交互
①创建了一个回调函数 callBack,将查询结果 List data 进行下发,并构造了订阅对象(sessionId、cmdId、tenantId、sessionSendMsgFunc消息下发方法),将订阅对象交给 oldSubService 缓存起来。用于限流的几个map,里面保存了一个租户、客户、用户下,每个session订阅的cmdId个数,集合里面保存了 sessionId 拼接 cmdId,这样可以计算出所有订阅的记录。注意只有开启了才会进行缓存。
2022-11-07 09:09:18
847
原创 【Thingsboard】源码分析:Transport 开发
(1)调用 DefaultTransportService.onSuccess(),方法传入 TbProtoQueueMsg 和 TransportServiceCallback。(2)从 kafka 队列中获取的响应 Response 可以解析出 requestId,从缓存中匹配到对应的 ResponseMetaData 找到里面的 future1。
2022-11-06 18:42:46
556
原创 【Thingsboard】源码分析:tb-core 的作用
/tbCoreMsgProducer.send 发送session事件例如open/close。//调用的 tbCoreMsgProducer.send 未知 用于coap协议设备。//tbCoreMsgProducer.send 订阅属性变更请求。//tbCoreMsgProducer.send 订阅rpc请求。//tbCoreMsgProducer.send 获取属性请求。//tbCoreMsgProducer.send 设备认领。//tbCoreMsgProducer.send 未知。
2022-11-06 18:41:26
636
原创 【Thingsboard】源码分析:调度器 schedul 开发
DefaultSchedulerService - 【日志】删除调度器 eventId=c1d493d0-a4db-11ec-a824-9997d34f46d1。
2022-11-06 18:39:53
557
原创 【Thingsboard】源码分析:规则引擎提交策略
RuleActor 线程池 RuleDispatcher 的扩大不会加快 ruel-engine 的 commit,因为调用 Actor.tell() 之后,调用 tryProcessQueue() 会利用 CAS 替换邮箱状态 FREE -> BUSY,如果替换失败说明当前邮箱正在执行 tryProcessQueue() 方法,也就是说同一时刻 RuleChainActor 只会调用一次 tryProcessQueue(),不可能同一个 Actor 同一时刻执行两个 tryProcessQueue()。
2022-11-06 18:38:13
991
原创 【Thingsboard】源码分析:如何开发规则链
首先从 kafka 队列中获取消息,获取一批消息 queue.rule-engine.poll-interval 配置 TB_QUEUE_RULE_ENGINE_POLL_INTERVAL_MS pollDuration 表示每隔这么长时间就从消息队列中获取一次消息。从前面的 kafka 队列分析,可以发现规则引擎从 kafka 中消费到消息之后就会直接提交到规则链中。调度器会定时发送消息进入规则链实现定时任务除了ota相关的调度器之外的都会发送消息到规则链。规则链服务从 kafka 中消费消息。
2022-11-06 18:36:21
752
原创 【Thingsboard】源码分析:OTA 更新
这个设备组内的设备或者单一的这个设备属于更新包的设备类型,那么就会触发升级。真正的更新是设备在订阅到ota文件的相关共享属性之后,拿到ota文件总字节数然后每次拉取一定数量的字节多次拉取完成 ota 文件的下载。如果是 http-transport 连接的设备,需要请求 http://host/api/v1/${access_token}/firmware?如果是 mqtt-transport 连接的设备,需要请求 v2/fw/request/${requestId}/chunk/${chunk} 主题。
2022-11-06 18:34:58
1143
原创 【Thingsboard】源码分析: kafka 的微服务架构
每次策略将消息重新提交到规则引擎时,这些消息都是原始消息的二进制副本。但是,在消息被取消之前开始处理消息的规则节点不会被中断。每次策略将消息重新提交到规则引擎时,这些消息都是原始消息的二进制副本。但是,在消息被取消之前开始处理消息的规则节点不会被中断。每次策略将消息重新提交到规则引擎时,这些消息都是原始消息的二进制副本。但是,在消息被取消之前开始处理消息的规则节点不会被中断。但是,在消息被取消之前开始处理消息的规则节点不会被中断。在设备 A 的先前消息被确认之前,不会提交例如设备 A 的新消息。
2022-11-06 18:32:13
1925
原创 【Thingsboard】源码分析:设备告警
基本上,如果您启用此选项和“获取警报规则的状态”选项,规则节点将能够发出警报。所以这就是为什么 deviceProfile 默认会存在于规则链的第一个节点,如果 deviceProfile 节点只放到 msg type switch 的遥测和属性上传后面的话,也就监听不到设备实体的删除和更新,会造成 deviceProfile 节点内部 deviceState 缓存错乱。有时候会发现,同一时刻一批设备的告警结束时间会跟随系统时间刷新,并且已经消除的告警又变成未消除状态,和每分钟执行的定时任务有关。
2022-11-06 18:26:46
1115
原创 【Thingsboard】源码分析:Actor模型架构
Device Actor: 维护设备的状态:活动会话、订阅、挂起的 RPC 命令等。App Actor:负责租户Actor的管理。处理规则引擎(链/节点)actor 消息的 actor 系统调度程序的线程池大小。处理 device actor 消息的 actor 系统调度程序的线程池大小。处理 tenant actor 消息的 actor 系统调度器的线程池大小。在切换到处理下一个参与者的消息之前,参与者系统将处理每个参与者的消息数。处理 app actor 消息的 actor 调度程序的线程池大小。
2022-11-06 18:25:24
968
原创 ARP 请求包分析
目的主机收到ARP请求后,将源主机的IP地址与MAC地址记录到自己的ARP高速缓存表中,然后给源主机发送ARP响应(封装在单播MAC帧中)ARP响应中包含有目的主机的IP地址和MAC地址。源主机在自己的ARP高速缓存表中查找目的主机的IP地址所对应的MAC地址,若找到了,则可以封装MAC帧进行发送,若找不到,则发送ARP请求(封装在广播MAC帧中);因为在网络中,每一台主机都会有发送ip包的时候。A要向B发送数据,A需要在自己的ARP缓存中用B的ip找到B的mac地址,然后向这个mac地址发送数据。
2022-11-03 13:18:40
4573
原创 TcpCopy 流量复制
tcpcopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去(也可以在测试系统内部放大流量),从而模拟真实运行环境,以便排查测试系统的性能问题和风险。TCPCopy的优势在于其实时性及真实性,除了少量的丢包,可以完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。
2022-11-03 13:18:28
1178
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅