`

一种高并发流控程序的简单轻量实现

 
阅读更多
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class FlowConcurrentController {
	// 每秒并发访问控制数量
	final static int MAX_QPS = 10;
	// 并发控制信号量
	final static Semaphore semaphore = new Semaphore(MAX_QPS);
	// 监控每秒并发访问次数(理论上accessCount.get() <= 10)
	final static AtomicInteger accessCount = new AtomicInteger(0);

	// 模拟远程访问
	private static void remoteCall(int i, int j) {
		System.out.println(String.format("%s - %s: %d %d", new Date(), Thread.currentThread(), i, j));
	}

	private static void releaseWork() { // 每秒release一次
		// release semaphore thread
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
			@Override
			public void run() {
				semaphore.release(accessCount.get());
				accessCount.set(0);
			}
		}, 1000, 1000, TimeUnit.MILLISECONDS);
	}

	// 模拟并发访问控制
	private static void simulateAccess(final int m, final int n)
			throws Exception { // m : 线程数;n : 调用数
		ExecutorService pool = Executors.newFixedThreadPool(100);
		for (int i = m; i > 0; i--) {
			final int x = i;
			pool.submit(new Runnable() {
				@Override
				public void run() {
					for (int j = n; j > 0; j--) {
						try {
							Thread.sleep(5);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}

						semaphore.acquireUninterruptibly(1);
						accessCount.incrementAndGet();
						remoteCall(x, j);
					}
				}
			});
		}

		pool.shutdown();
		pool.awaitTermination(1, TimeUnit.HOURS);
	}

	public static void main(String[] args) throws Exception {
		// 开启releaseWork
		releaseWork();
		
		// 开始模拟lots of concurrent calls: 100 * 1000
		simulateAccess(100, 1000);
	}

}

 http://blog.csdn.net/mn11201117/article/details/8809511

分享到:
评论

相关推荐

    基于OpenResty的百万级长连接推送.pdf

    3. 并发量大:基于OpenResty的长连接推送系统需要解决高并发问题。通过使用worker级别的流控、ngx.semaphore和共享内存队列等技术,可以实现高效的并发处理。 4. 实施过程与优化:基于OpenResty的长连接推送系统的...

    socket网络编程 UDP协议实现

    UDP(User Datagram Protocol)是互联网协议族中的一种无连接、不可靠的传输协议,与TCP相比,它更轻量级,适用于对实时性要求高但对数据完整性要求不那么严格的应用场景,如在线视频、语音通话等。在进行UDP网络...

    SpringCloudAlibaba分布式流量控制组件Sentinel实战与源码分析-中.doc

    热点参数限流是 Sentinel 的一种特殊的流控规则,主要是对热点参数的访问频次进行限制,以避免热点参数的访问频次超出系统的承载能力。热点参数限流规则可以根据参数的名称、参数的类型、参数的访问频次等来定义。 ...

    SpringCloudAlibaba入门之Sentinel(SCA).doc

    Sentinel 是一种轻量级的流量控制、熔断降级组件,专门为分布式系统设计,目标是保证微服务的高可用性和防止雪崩。下面是 Sentinel 的一些重要知识点: 1. 微服务调用存在问题:微服务之间的调用可能会导致级联...

    阿里面试(2).pdf

    - REST规范:定义了一组互联网应用的架构约束,实现轻量级、无状态的交互。 六、CAP三进二和BASE定理 - CAP定理:一致性(Consistency)、可用性(Availability)、分区容忍性(Partition tolerance)三者不可兼得,只能...

    web端 多路 视频实时播放rtsp流

    SpringBoot是基于Spring框架的轻量级开发工具,简化了创建独立的、生产级别的基于Spring的应用程序过程。在这个项目中,SpringBoot作为后端服务的基础,提供了RESTful API接口,用于处理WebSocket连接和处理FFmpeg的...

    高性能内存消息和事件驱动库 Chronicle.7z

    Chronicle库提供了一种轻量级的消息传递机制,它使用了创新的数据结构和算法,使得在Java堆内存中的数据操作达到近乎原生速度。它的核心组件包括: 1. **Chronicle Queue**:一个持久化的、顺序的、低延迟的消息...

    Erlang的HTTP2服务器。男孩,那家伙是个真正的话痨_Erlang_JavaSc.zip

    Erlang是一种面向并发的、基于actor模型的编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、容错性和可扩展性的分布式系统。在这个“Erlang的HTTP2服务器。男孩,那家伙是个真正的话痨”项目中,...

    Sentinel底层原理分析.pdf

    Sentinel是一款轻量级的流控(流量控制)组件,主要应用于分布式服务架构中,用于实现微服务的流量控制、熔断降级、系统负载保护等功能。流控是Sentinel三大核心能力之一,下面将详细介绍Sentinel使用的几种常见限流...

    开源项目-grpc-grpc-go.zip

    - **并发控制**:grpc-go 提供了并发控制机制,如流控和负载均衡,确保在高并发场景下的稳定性。 - **健康检查**:内置健康检查接口,服务端可以报告其运行状态,客户端可以根据此信息决定是否发送请求。 - **...

    微服务保护 Sentinel

    微服务架构是一种将单一应用程序分解为一组小型服务的方法,每个服务运行在其自己的进程中,服务之间通过轻量级通信机制(通常是 HTTP RESTful API)进行交互。这种架构使得服务能够独立部署、扩展和升级,提高了...

    Spring Cloud Alibaba(基础) 学习笔记

    微服务架构是一种将单一应用程序开发为一组小服务的方法,每个服务运行在其独立的进程中,并使用轻量级机制(通常是HTTP资源API)进行通信。这种架构风格允许服务独立地部署、扩展和维护。以下是关于微服务架构发展...

    第讲-服务器软件设计的算法和问题优秀文档.ppt

    相反,无连接的服务,如UDP,轻量级且快速,但需要应用程序自行处理可靠性问题。 选择TCP还是UDP取决于应用需求。例如,HTTP、HTTPS等需要稳定性的协议常使用TCP,而DNS、多媒体流等对实时性要求高的场景可能选择...

    .Net Core 基于Ocelot开发企业级API网关。来自腾讯张善友分享。

    而Ocelot则是一款基于.NET Core开发的企业级API网关,它具有轻量级、高性能和易于配置的特点。 在分享中,张善友介绍了如何基于Ocelot开发企业级API网关。他首先对企业级API网关进行了介绍,随后阐述了如何利用*** ...

    srs-server-4.0-r1.tar

    1. 高效性能:SRS以其轻量级和高性能著称,能在较低配置的硬件上运行,同时保持稳定的视频流传输,确保观众可以流畅观看。 2. 实时性:通过优化的网络传输算法,SRS能实现低延迟的视频传输,为观众带来近乎实时的...

    unix网络编程源码

    2. **TCP协议**:TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。在Unix网络编程中,使用TCP需要经过三次握手建立连接,然后才能进行数据传输。TCP通过确认机制、重传和流控保证数据的正确性。`socket(AF_...

    UNIX 网络编程 卷一 (中文第二版)

    - **客户端实现**:如何编写一个简单的TCP或UDP客户端程序。 《UNIX网络编程 卷一》中文第二版不仅涵盖了以上知识点,还包括实际的示例代码,帮助读者理解并应用这些理论。通过学习本书,读者能够掌握UNIX环境下的...

    udp网络通讯协议demo

    与TCP(Transmission Control Protocol)相比,UDP提供了更轻量级的服务,不提供顺序保证、错误检测或流控,因此在某些需要快速传输但对数据完整性要求不高的场景下,UDP更具优势。 在这个"udp网络通讯协议demo"中...

    springcloud+sentinelan安装包

    Hystrix是Netflix开源的,而Sentinel是阿里巴巴开源的,两者都能防止服务雪崩,通过熔断机制保护系统在高并发或者服务异常时的稳定性。Sentinel提供了丰富的流量控制策略,如流控、降级、热点防护等,更适合现代...

    百老汇:使用Elixir进行并发和多阶段数据提取和数据处理

    Elixir是一种基于Erlang虚拟机(BEAM)的函数式编程语言,其设计目标是构建高可用、容错性强和并发性能优秀的系统。Elixir的并发模型主要依赖于进程(Processes),它们是轻量级的、独立执行的实体,可以安全地并行...

Global site tag (gtag.js) - Google Analytics