-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfeed.json
26 lines (26 loc) · 12.7 KB
/
feed.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"version": "https://jsonfeed.org/version/1",
"title": "Mylog",
"subtitle": "",
"icon": "http://example.com/images/favicon.ico",
"description": "",
"home_page_url": "http://example.com",
"items": [
{
"id": "http://example.com/2024/09/11/%E9%A1%B9%E7%9B%AE%E9%9A%BE%E7%82%B9/",
"url": "http://example.com/2024/09/11/%E9%A1%B9%E7%9B%AE%E9%9A%BE%E7%82%B9/",
"title": "项目难点",
"date_published": "2024-09-11T05:44:06.312Z",
"content_html": "<h1 id=\"安易控\"><a class=\"markdownIt-Anchor\" href=\"#安易控\">#</a> 安易控</h1>\n<p>Nacos 作为配置中心</p>\n<p>Redis 做分布式缓存、过期监听</p>\n<p>Zookeeper 做分布式锁</p>\n<p>WebSocket+Netty 做消息推送</p>\n<p>阿里云 VOD 视频点播实现监控记录视频存储</p>\n<p>使用 ES 实现全文搜索,加快对监控记录进行筛选查找</p>\n<p>使用 RabbitMQ 进行消息异步通知</p>\n<h2 id=\"redis实现分布式缓存\"><a class=\"markdownIt-Anchor\" href=\"#redis实现分布式缓存\">#</a> Redis 实现分布式缓存</h2>\n<ol>\n<li>配置 MyBatis 的本地缓存:在 MyBatis 的配置文件(通常是 <code>mybatis-config.xml</code> )中,启用并配置本地缓存的相关属性,例如缓存的有效期、大小等。</li>\n<li>引入 Redis 依赖:在项目的构建文件(如 Maven 的 <code>pom.xml</code> 或 Gradle 的 <code>build.gradle</code> )中添加 Redis 客户端的依赖。</li>\n<li>创建 Redis 操作工具类:编写一个用于与 Redis 进行交互的工具类,包括连接 Redis 服务器、设置和获取缓存值等方法。</li>\n<li>在 MyBatis 的拦截器中处理缓存:创建一个 MyBatis 的拦截器,拦截查询操作。\n<ul>\n<li>首先检查本地缓存是否命中,如果命中则直接返回结果。</li>\n<li>如果本地缓存未命中,再从 Redis 中查找。</li>\n<li>如果 Redis 中也未命中,则执行实际的数据库查询操作,并将结果存入 Redis 和本地缓存。</li>\n</ul>\n</li>\n<li>配置拦截器:在 MyBatis 的配置文件中注册上述创建的拦截器。</li>\n</ol>\n<h2 id=\"zookeeper实现分布式锁\"><a class=\"markdownIt-Anchor\" href=\"#zookeeper实现分布式锁\">#</a> Zookeeper 实现分布式锁</h2>\n<p>在 ZooKeeper 中实现分布式锁的基本原理是利用 ZooKeeper 的顺序节点(Sequential Node)和临时节点(Ephemeral Node)特性。</p>\n<p>客户端尝试在 ZooKeeper 中创建一个带有指定路径的临时顺序节点,例如 /locks/lock-000000001。<br>\n客户端获取 /locks 节点下的所有子节点,并按节点名称的顺序排序。<br>\n客户端判断自己创建的节点是否为最小节点,如果是,则认为获取锁成功;否则,监听自己前一个节点的删除事件,并进入等待状态。<br>\n当前最小节点的客户端完成操作后,删除自己创建的节点,触发监听的客户端继续判断是否为最小节点,直到获取锁成功。</p>\n<p>利用独占锁机制控制对同一监控记录的高并发操作,保证只有一个对监控记录的有效操作其余操作直接返回监控记录操作中(点赞、转发)</p>\n<h2 id=\"websocketnetty消息推送\"><a class=\"markdownIt-Anchor\" href=\"#websocketnetty消息推送\">#</a> WebSocket+Netty 消息推送</h2>\n<p>使用 WebSocket+Netty 与人工智能端进行数据交互,将模型分析的数据传给后端进行进一步处理</p>\n<h2 id=\"rabbitmq实现异步消息通知\"><a class=\"markdownIt-Anchor\" href=\"#rabbitmq实现异步消息通知\">#</a> RabbitMQ 实现异步消息通知</h2>\n<p>当接收到人工智能端发送的图片信息后在进行数据处理时将消息异步通知给对应的绑定用户</p>\n<h2 id=\"zookeeper和nacos\"><a class=\"markdownIt-Anchor\" href=\"#zookeeper和nacos\">#</a> Zookeeper 和 Nacos</h2>\n<p>Zookeeper 适用于以下场景:</p>\n<p>需要实现分布式一致性和原子性操作的场景</p>\n<p>需要实现分布式锁、分布式队列、分布式计数器等数据结构的场景</p>\n<p>需要实现集中化管理配置信息的场景</p>\n<p>Nacos 适用于以下场景:</p>\n<p>需要实现微服务架构中的配置管理和服务发现的场景</p>\n<p>需要实现动态更新应用程序配置的场景</p>\n<p>需要实现微服务之间的通信和协同的场景</p>\n<h1 id=\"快易票\"><a class=\"markdownIt-Anchor\" href=\"#快易票\">#</a> 快易票</h1>\n<p>利用分布式缓存,在秒杀开始前,提供高性能余票查询,同时要考虑缓存击穿、穿透、雪崩等问题</p>\n<p>使用第一层验证码,纯前端验证码在前端削弱瞬时高峰,将 100 毫秒内 10 万人的请求,分散成 1~2 秒内 10 万人请求</p>\n<p>使用第二层验证码,后端验证码,进一步分散请求,同时防止机器人抢票</p>\n<p>使用限流技术减轻无谓请求,同时给用户快速失败响应 (告知票没有了),将 9 万请求快速失败,变成 1 万请求抢 1000 张票</p>\n<p>使用令牌发放技术,控制抢票量,同时防止机器人刷票,比如开放 2000 令牌,即变成 8000 请求快速失败,变成 2000 请求抢 1000 张票</p>\n<p>使用分布式锁技术,防止超卖,即 2000 人抢 1000 张票,最终只能卖出 1000 张,不能卖出 1001 张票</p>\n<p>使用异步削峰 + 排队机制,解决吞吐量问题,实现最短间内给用户反馈,1000 请求告知票没有了,1000 请求告知排队中</p>\n<p>使用分布式事务,保证数据最终一致性,不能库存减少了,票却没打出来</p>\n<h2 id=\"雪花算法\"><a class=\"markdownIt-Anchor\" href=\"#雪花算法\">#</a> 雪花算法</h2>\n<p>原理:生成一个 64 位的 long 类型的唯一 id</p>\n<p>优点:</p>\n<p>系统环境 ID 不重复:能满足高并发分布式系统环境 ID 不重复,比如分布式场景下的数据库表的 ID 生成。</p>\n<p>生成效率极高:在高并发,以及分布式环境下,除了生成不重复 id,每秒可生成百万个不重复 id,生成效率极高。</p>\n<p>保证基本有序递增:基于时间戳,可以保证基本有序递增,很多业务场景都有这个需求。</p>\n<p>不依赖第三方库:不依赖第三方的库,或者中间件</p>\n<p>算法简单,在内存中进行。</p>\n<p>缺点:依赖服务器时间:服务器时钟回拨时可能会生成重复 id。</p>\n<h2 id=\"redis分布式缓存\"><a class=\"markdownIt-Anchor\" href=\"#redis分布式缓存\">#</a> Redis 分布式缓存</h2>\n<p>第一次访问将余票数据存入 redis 内存中,更新频率为在 redis 中缓存每车次的售票数,每五次更新一次 redis 余票数据缓存</p>\n<p>其他实现:</p>\n<p>ehcache 是一个纯 java 的进程内缓存框架,它直接在 jvm 虚拟机中缓存,速度快,效率高,但缓存共享麻烦,集群分布式应用不方便</p>\n<p>Memcached: Memcached 是一个高性能的分布式内存对象缓存系统,主要用于缓存数据和减轻数据库负载。Memcached 基于内存存储,支持键值对的存储,并提供简单的 API 接口。</p>\n<p>Hazelcast: Hazelcast 是一个开源的分布式内存数据网格,提供了分布式数据结构和集群管理功能,可以用于缓存、数据存储和分布式计算。</p>\n<p>Apache Ignite: Apache Ignite 是一个内存中数据网格平台,提供了分布式缓存、分布式计算和分布式存储等功能,支持 SQL 查询和事务处理。</p>\n<h2 id=\"redisson分布式锁\"><a class=\"markdownIt-Anchor\" href=\"#redisson分布式锁\">#</a> Redisson 分布式锁</h2>\n<p>利用看门狗机制(锁构成:自定义 enum 参数 + 时间戳 + 车次编号),在抢票时对出票事务加上分布式锁</p>\n<p>优点:自动延期机制(在获取锁时看门狗机制会在等待时间内在规定的时间间隔重复获取锁),</p>\n<p>缺点:时钟不同步问题(若各个节点的时钟不同步,就有可能拿到同一把锁)</p>\n<h2 id=\"sentinel限流\"><a class=\"markdownIt-Anchor\" href=\"#sentinel限流\">#</a> Sentinel 限流</h2>\n<p>使用限流技术减轻无谓请求,同时给用户快速失败响应 (告知票没有了),将 9 万请求快速失败,变成 1 万请求抢 1000 张票</p>\n<h2 id=\"如何解决单个用户重复请求\"><a class=\"markdownIt-Anchor\" href=\"#如何解决单个用户重复请求\">#</a> 如何解决单个用户重复请求</h2>\n<p>利用 Redis,在点击时生成用户 id + 列车号的唯一凭证,判断是否存在,存在则直接返回,不存在则直接存入 Redis 并设置 3 秒过期时间</p>\n<p>利用 @repeatSubmit 注解防止重复提交</p>\n<h2 id=\"选座算法\"><a class=\"markdownIt-Anchor\" href=\"#选座算法\">#</a> 选座算法</h2>\n<p>选座是按照计算座位偏移量,先统计符合的车厢,再依次进行选座</p>\n<p>先查询乘客选择的列车的所有座位类型编号而后组成和前端两排选座一样的列表,用于作参照的座位列表,再用乘客所选的座位计算出与第一个位置的绝对偏移值,再依次判断区间是否可卖,最终完成选座</p>\n<h2 id=\"购票逻辑\"><a class=\"markdownIt-Anchor\" href=\"#购票逻辑\">#</a> 购票逻辑</h2>\n<p>完成座位选择后经过前端第一层验证码,再通过后端生成的图形验证码校验后分两种情况,一部分是被限流直接返回稍后重试,一部分是抢不到令牌的也直接返回稍后重试,剩余的进入排队购票,一半告知没票了,一半告知排队中,若没有所选座位则直接随机选座,抢票成功则进入订单页面,若有则进行选座计算,无法选择则随机选座。</p>\n<h2 id=\"为什么有两层验证码\"><a class=\"markdownIt-Anchor\" href=\"#为什么有两层验证码\">#</a> 为什么有两层验证码</h2>\n<p>因为第一层前端验证码无法防止机器人刷票,第二层图形验证码无法承受瞬时高峰需要前端第一层分流</p>\n",
"tags": []
},
{
"id": "http://example.com/2024/09/05/hello-world/",
"url": "http://example.com/2024/09/05/hello-world/",
"title": "mylog",
"date_published": "2024-09-05T07:43:22.302Z",
"content_html": "<p>Welcome to <span class=\"exturl\" data-url=\"aHR0cHM6Ly9oZXhvLmlvLw==\">Hexo</span>! This is your very first post. Check <span class=\"exturl\" data-url=\"aHR0cHM6Ly9oZXhvLmlvL2RvY3Mv\">documentation</span> for more info. If you get any problems when using Hexo, you can find the answer in <span class=\"exturl\" data-url=\"aHR0cHM6Ly9oZXhvLmlvL2RvY3MvdHJvdWJsZXNob290aW5nLmh0bWw=\">troubleshooting</span> or you can ask me on <span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2hleG9qcy9oZXhvL2lzc3Vlcw==\">GitHub</span>.</p>\n<h2 id=\"quick-start\"><a class=\"anchor\" href=\"#quick-start\">#</a> Quick Start</h2>\n<h3 id=\"create-a-new-post\"><a class=\"anchor\" href=\"#create-a-new-post\">#</a> Create a new post</h3>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ hexo new <span class=\"string\">"My New Post"</span></span><br></pre></td></tr></table></figure></p>\n<p>More info: <span class=\"exturl\" data-url=\"aHR0cHM6Ly9oZXhvLmlvL2RvY3Mvd3JpdGluZy5odG1s\">Writing</span></p>\n<h3 id=\"run-server\"><a class=\"anchor\" href=\"#run-server\">#</a> Run server</h3>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ hexo server</span><br></pre></td></tr></table></figure></p>\n<p>More info: <span class=\"exturl\" data-url=\"aHR0cHM6Ly9oZXhvLmlvL2RvY3Mvc2VydmVyLmh0bWw=\">Server</span></p>\n<h3 id=\"generate-static-files\"><a class=\"anchor\" href=\"#generate-static-files\">#</a> Generate static files</h3>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ hexo generate</span><br></pre></td></tr></table></figure></p>\n<p>More info: <span class=\"exturl\" data-url=\"aHR0cHM6Ly9oZXhvLmlvL2RvY3MvZ2VuZXJhdGluZy5odG1s\">Generating</span></p>\n<h3 id=\"deploy-to-remote-sites\"><a class=\"anchor\" href=\"#deploy-to-remote-sites\">#</a> Deploy to remote sites</h3>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ hexo deploy</span><br></pre></td></tr></table></figure></p>\n<p>More info: <span class=\"exturl\" data-url=\"aHR0cHM6Ly9oZXhvLmlvL2RvY3Mvb25lLWNvbW1hbmQtZGVwbG95bWVudC5odG1s\">Deployment</span></p>\n",
"tags": []
}
]
}