APP下载

基于Nginx负载均衡及多线程智慧农业系统的设计

2017-05-16隗超张伟石澜

物联网技术 2017年4期
关键词:负载均衡

隗超+张伟+石澜

摘 要:鉴于Nginx服务器在负载均衡方面的优越性能,将其运用到智慧农业系统设计中,可以很好地解决系统在大并发访问下的性能瓶颈问题。智慧系统中应用服务器来处理指令信息的中转,有很复杂的业务逻辑关系,而利用Java多线程技术可以很好的处理这些业务逻辑。

关键词:Nginx服务器;负载均衡;Java多线程;智慧农业系统

中图分类号:TP393 文献标识码:A 文章编号:2095-1302(2017)04-0-02

0 引 言

基于底层传感器节点采集信息的智慧农业系统,可以大量获取作物的生长环境参数,在Web平台上显示时,会有大量用户进行作物实时参数的查询请求,加入Nginx负载均衡,能够使Web服务器更好的应对高并发的用户访问场景。在系统中,通过PC网站发送控制指令,经由Web服务器传达到应用服务器,由应用服务器转发给嵌入式服务器。应用服务器由收指令线程和发指令线程组成,通过线程之间的同步和通信可以很好地保障指令发送的正确性,可靠性。

1 Nginx负载均衡

Nginx是Igor Sysoev使用C语言为俄罗斯门户网站Rambler.ru开发的一款Web服务器。Nginx以其高性能、稳定、功能丰富、配置简单灵活以及内存消耗低等特点而受到国内外企业的广泛青睐。

当Nginx服务器启动后,它将产生一个主进程(Master Process),主进程在执行一些业务后,会产生一到多个工作进程(Worker Process)。主进程主要完成Nginx配置文件解析、模块配置和注册、数据结构初始化、网络监听生成、工作进程生成和管理以及信号处理;工作进程主要包括模块调用、进程初始化以及请求处理,是Nginx服务器运行过程中提供服务的主要工作部分。Nginx使用一个主进程来管理多个工作进程,通过内存共享等进程间通信机制实现Nginx的负载均衡等功能。Nginx的结构关系如图1所示。

2 Java里的多线程同步机制

在多线程程式中,所有线程都是各自独立的执行体,但线程代码的模式却相同。如果这些线程协同工作,那么其线程代码无法重入控制,因此Java提供了相应的同步机制,从而阻止多个线程的一个或多个关键代码在任意时间执行该代码。该机制建立在锁的概念和监视器基础上,其中监视器是关键代码周围的保护伞,锁则是监视器阻止线程进入监视器的软件。其基本理念是:如果一个线程要进入监视器所监视的关键代码,该线程需要获取一个与之相关的锁;如果别的线程在使用该锁,那么Java就会强制要求其在一个与锁以及监视器相关的区域等待;当锁被释放时,Java移出等待状态中的线程,同意其获取锁,并对监视器的关键代码进行相应处理。在Java编程过程中经常使用Synchronized方法和Synchronized代码块进行线程的同步。

2.1 Synchronized方法

把 Synchronized 的 关 键 字 加 入 方 法 声 明 中以声 明synchronized()方法。在 synchronized()方法中,类成员变量访问由 synchronized()方法控制,每个类实例都会对应一个锁,如果synchronized()方法要执行就要获取相应的锁,否则会阻塞所属线程。一旦该方法进入执行状态就会独占一个锁,且直至其返回才会释放。这种机制可以确保在同一时间对于每一个类实例,其声明为Synchronized的成员函数最多只能有一个处于执行状态,从而避免类成员变量访问产生冲突。Java中每个类都对应一把这样的锁,因此要控制其访问类的静态成员变量,可把类的静态成员函数声明为 Synchronized。

2.2 Synchronized代码块

上述方法中,如果代码量较多,则声明的效率会大受影响,因此我们可以用 Synchronized块来解决该问题。Synchronized块中要获取SynObject对应的锁才可以执行,由于可以对任何代码块且上锁的对象任意指定,因此相对 Synchronized块方法有较高的灵活性。

3 多线程同步在系统中的应用

在智慧农业系统中,应用服务器主要负责Web服务器发送的指令接收和指令向嵌入式服务器的发送以及上行数据在数据库的存储。应用服务器的模块构成如图2所示。

Web服务器的指令请求发到应用服务器,应用服务器会通过管理模块起一个进程,并运行主线程来开启指令接收的线程,同时开启上行数据存储线程来接收嵌入式服务器上传的监测数据,并存储到MySQL数据库中。指令接收线程接收到指令数据后会启动指令发送线程来向嵌入式服务器发送指令数据。指令接收线程和指令发送线程之间的协作通过线程的同步机制Synchronized代码块实现。为防止两个不同线程在访问共享资源时修改其内容,使用了Java阻塞机制,notify()和wait()方法。wait()使线程进入阻塞状态,notify()解除阻塞状态的线程。两个方法的配合使用与线程同步共同作用来保证指令接收线程和指令发送线程的正确协作。

4 农业监测系统实现

在加入Nginx负载均衡服务器以及应用服务器多線程后的系统架构如图3所示。

在客户端和Web服务器之间加入了负载均衡服务器,让Web集群分担来自客户端的请求访问压力,提高系统的响应性能,增强用户体验。在应用服务器加入多线程可以并发处理多个指令请求,以提高系统的处理性能。

5 结 语

随着互联网技术的进一步深度发展以及物联网技术的普及,物联网与传统农业的融合进一步加深,智慧农业是未来农业发展的必然趋势。当越来越多的农户使用智慧农业系统时,对系统的性能就提出了更高的要求,该论文设计的系统可以很好地满足该方面的需求。但随着用户的增加与数据的积累,对数据进行处理也是必不可少的业务,而这正是该系统欠缺的部分。但相信随着进一步的设计开发,这个问题一定会得到完满解决。

参考文献

[1]崔妍.浅谈Java多线程编程[J].信息科技,2011(3):227,249.

[2]王利萍.基于Nginx服务器集群负载均衡技术的研究与改进[D].济南:山东大学,2015.

[3]王永辉.基于Nginx高性能Web服务器性能优化与负载均衡的改进与实现[D].成都:电子科技大学,2015.

[4]杨小娇.轻量级高并发Web服务器的研究与实现[D].南京:南京邮电大学,2014.

[5]郭广军,胡玉平,戴经国.基于Java多线程的并行计算技术研究及应用[J].华中师范大学学报(自然科学版),2005,39(2):169-173.

[6]刘丽君,张伟,陈博.基于AJAX的智慧农业监控系统Web前端设计[J].物联网技术,2016,6(1):13-14.

[7]朱玉钦.物联网技术在现代农业中的应用——以南京市为例[J].物联网技术,2016,6(7):106-107.

[8]张博文,张正炳.基于物联网的智慧农业系统设计[J].长江大学学报(自然科学版),2016,13(28):66-70.

猜你喜欢

负载均衡
异构环境下改进的LATE调度算法