首页 > 其他分享 >skynet框架:并发热点处理方案

skynet框架:并发热点处理方案

时间:2024-05-13 20:20:17浏览次数:26  
标签:.__ return 框架 -- self 并发 user skynet end

  1. 对于关键流程,所有请求都要求返回有效结果,如创建socket连接:
function luasocket:connect()
		return socketcore.open(self.__host, self.__port)
end

显然外部调用需要获取到正确的socket句柄用于数据交互,当并发调用此接口时,所有调用都需要获取到有效的句柄以保证业务正常;

方案:加锁,保证临界区只由唯一的coroutine正确执行,并发的其他coroutine在临界区处休眠等待,临界区执行完成后,负责唤醒所有休眠的coroutine,直接获取有效结果返回;

function luasocket:safe_connect()
  	local conn
  	local nwaitingco = #self.__connecting -- wait queue
  	if nwaitingco > 0 then
  			-- connecting in other coroutine
  			local co = coroutine.running()
  			table.insert(self.__connecting, co)
  			skynet.wait(co)
  			return assert(conn) -- return conn when being awakened
  	end

  	-- the effective coroutine which build connect
  	self.__connecting[1] = true -- lock
  	conn = socketcore.open(self.__host, self.__port)
  	-- wake all wait coroutines
  	for i=2, #self.__connecting do
  			local co = self.__connecting[i]
  			self.__connecting[i] = nil
  			skynet.wakeup(co)
  	end
  	self.__connecting[1] = nil -- unlock
  	return assert(conn)
end
  1. 对于非关键或接受单次请求无效,支持重入的流程,如定时存盘:
function user:save(query, document)
  	return mongodb.update(query, document)
end

数据以全量覆盖的形式存盘,那么单次存盘无效认为是可以接受的,下一次请求到来的时候数据能够正确写入;

方案:临界区加锁,无效并发的存盘请求;

function user:safe_save(query, document)
		if user.__saving then
				-- saving in other coroutine, return succ
				return true
  	end
  	user.__saving = true -- lock
  	-- do save
  	mongodb.update(query, document)
  	user.__saving = nil -- unlock
  	return true
end

做得更好的方案,对并发的coroutine做消息降级,兼顾请求有效同时确保请求能被正确唤醒;

function user:safe_save2(query, document)
		if user.__saving then
				-- saving in other coroutine, sleep
				skynet.sleep(delay)
				if user.__saving then -- double check
						return true
				end
  	end
  	user.__saving = true -- lock
  	-- do save
  	mongodb.update(query, document)
  	user.__saving = nil -- unlock
  	return true
end

标签:.__,return,框架,--,self,并发,user,skynet,end
From: https://www.cnblogs.com/linxx-/p/18189905

相关文章

  • ElasticSearch 数据并发冲突处理
    一.概述Elasticsearch使用文档版本来控制文档的并发更新,并用于解决冲突。Elasticsearch从写入到检索的时间间隔是由刷新频率refresh_interval设定的,该值可以更新,但默认最快是1s,也就是这1秒之内如果同一条数据(文档的新版本必须复制到群集中的其他节点。Elasticsearch也是异......
  • 使用Devexpress框架的项目发布时缺失dll的相关问题记录
    首先说我自己实践得到的结论:但凡bin/release或debug下的.exe可执行文件,运行时要用的dll,放在其同路径下,就可以被找到并正常运行。注意:1.如果直接在bin/release或debug下点击exe没反应,可以在控制面板——>系统和安全——>安全和维护,点开维护查看可靠性历史记录可以看到......
  • openGauss 管理并发写入操作
    管理并发写入操作事务隔离说明写入和读写操作并发写入事务的潜在死锁情况并发写入示例......
  • Entity Framework Core中的并发处理
    1.常见的并发处理策略要了解如何处理并发,就要知道并发的一般处理策略悲观并发策略悲观并发策略,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守悲观的态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观并发策略大多数......
  • go高并发之路——缓存穿透、缓存雪崩
    缓存击穿、缓存穿透、缓存雪崩是使用Redis的三个经典问题,上篇文章讲了缓存击穿,今天就讲下剩下的两个问题。一、缓存穿透定义:缓存穿透是指查询一个根本不存在的数据,缓存层和DB层都不会命中。这样缓存永远不会生效,这些请求最终都会访问数据库。引起DB的压力瞬间变大,导致服务不可用......
  • Django - Rest Framework 框架
    目录DRF的安装与配置序列化类SerializerDRF的安装与配置为了简化API的开发过程,我们可以使用DjangoRestFramework框架实现API开发。使用框架开发不仅能减少代码冗余,还可以规范代码的编写格式,这对企业级开发来说很有必要,毕竟每个开发人员的编程风格存在一定的差异,开发规范可......
  • Java-线程-并发解决方案
    0.背景在[Java-线程-并发]这篇文章中,我们引入了并发场景下的一些问题,并在末尾给出了几种常见的解决方案。1.方案1.1synchronizedsynchronized是Java中的一个关键字,用于提供同步机制,保证多线程环境下对共享资源的安全访问。通过使用synchronized,Java虚拟机(JVM)保证同一时......
  • 推荐一个好用的.net开发框架
    企业应用开发平台(EnterpriseDevelopPlatform),以下简称EDP。EDP是一套集完整组织架构,全面权限体系,以及各类基础功能于一体的基于.net的企业应用开发平台。其最大的特点是将复杂的数据行列权限的实现通过简单且友好的编码方式面向开发人员,同时EDP还提供了全面的系统基础管理功能,以......
  • 使用 Redisson 框架基于 Redis 实现分布式锁
    分布式锁可以采用数据库、zookeeper、redis三种方式实现。采用数据库实现方式,主要采用表字段的唯一索引特性。数据库是非常昂贵的资源,非常不推荐,最致命就是性能,不要去增加不必要的负担。采用zookeeper的实现方式,主要使用其为客户端创建临时有序节点的特性,在我之前的博客有介......
  • Java-线程-并发问题和ConcurrentHashMap
    0.背景在经典八股文中,我们会背:啊,hashmap是线程不安全的,concurrentHashMap是线程安全的。然后呢,又背:啊,为啥ConcurrentHashMap是安全的,因为加锁了。好好好,接着八股:啊,啥啥分段锁。本文,结合实际例子来进行分析,这他妈的到底是在叭叭啥。一切,从一个Hashmap的demo谈起。pu......