首页 文章 精选 留言 我的

精选列表

搜索[稳定],共10028篇文章
优秀的个人博客,低调大师

进击谷歌:多线程下程序顺序怎么稳定不乱?

题目 比如我们有三个方法,类似以下代码 static void Methond1() { Console.WriteLine($"{Thread.CurrentThread.Name} 执行 第一个方法=="); } static void Methond2() { Console.WriteLine($"{Thread.CurrentThread.Name} 执行 第二个方法======="); } static void Methond3() { Console.WriteLine($"{Thread.CurrentThread.Name} 执行 第三个方法======="); } } 分别初始化三个线程去执行这三个方法,每个线程执行的方法可以任意指定,但是方法的执行顺序必须是:Methond1=》Methond2=》Methond3 示例: 输入:3,2,1 第一个线程执行方法3,第二个线程执行方法2,第三个线程执行方法1 输出:Methond1的输出=》Methond2的输出=》Methond3 的输出 ,即: xxx执行 第一个方法== xxx执行 第二个方法== xxx执行 第三个方法== 题解分析 这道题本质上考的是多线程环境资源竞争的问题,在多线程环境下要想以固定某个顺序执行方法,必须要有一个类似屏障的东西来阻止不该执行的线程,或者换句话说必须要有一个机制来顺序化多个线程。这也是我们平时多线程开发环境中必须要面对的问题,现代服务器的cpu都是多核心,我们平时用的最多的java,c#等高级语言是能够利用服务器多核心这个优势的,这里是一个进程内,多线程就可以利用多核心。当然也有一些别的技术,比如Nodejs,虽然执行是单线程的,但是可以利用多进程来提高多物理cpu的利用率。 说的有点远了,接下来还是看这道题,这道题目考验的是多线程下资源的竞争问题和线程间的通信问题,说的直白一点就是:Methond1未执行之前,任何方法都不能执行(这里是指方法内的代码),Methond1执行完之后,会通知执行Methond2的线程,Methond2开始执行,Methond2执行完毕会通知执行Methond3的线程,以此类推。所以这道题的关键在于阻塞某个线程执行和通知某个线程执行。 在很多语言中都提供了lock的机制,或者信号量的机制。这些都是可以实现线程间通信的的解决方案,当然最简单暴力的方式还是通过共享变量的方式来实现通知,虽然有很多缺陷,但是在很多情况下确实是最简单快捷的方案。下边就以c#语言为例: class Program { //把三个方法分别对应到 委托,为了方便执行方法 static Action FirstAction = Methond1; static Action SecondAction = Methond2; static Action ThirdAction = Methond3; static Dictionary<int, Action> ActionDic = new Dictionary<int, Action>() { { 1, FirstAction }, { 2, SecondAction }, { 3, ThirdAction } }; static void Main(string[] args) { while (true) { Console.WriteLine("请输入顺序"); var inputStr = Console.ReadLine(); IsFinish1 = IsFinish2 = false; var input = inputStr.Split(",").Select(s => int.Parse(s)); foreach (var i in input) { var method = ActionDic.GetValueOrDefault(i); Thread t = new Thread(method.Invoke); t.Name = "线程" + i; Console.WriteLine($"{t.Name} 执行方法 {method.Method.Name}"); t.Start(); } } } static object objLock = new object(); static bool IsFinish1 = false; //第一方法是否执行完毕 static bool IsFinish2 = false; //第二方法是否执行完毕 static void Methond1() { Console.WriteLine($"{Thread.CurrentThread.Name} 执行 第一个方法=="); IsFinish1 = true; } static void Methond2() { while (true) { if (IsFinish1) { Console.WriteLine($"{Thread.CurrentThread.Name} 执行 第二个方法======="); IsFinish2 = true; break; } } } static void Methond3() { while (true) { if (IsFinish2) { Console.WriteLine($"{Thread.CurrentThread.Name} 执行 第三个方法======="); break; } } } } 测试执行: 请输入顺序 2,3,1 线程2 执行方法 Methond2 线程3 执行方法 Methond3 线程1 执行方法 Methond1 请输入顺序 线程1 执行 第一个方法== 线程2 执行 第二个方法======= 线程3 执行 第三个方法======= 3,2,1 线程3 执行方法 Methond3 线程2 执行方法 Methond2 线程1 执行方法 Methond1 请输入顺序 线程1 执行 第一个方法== 线程2 执行 第二个方法======= 线程3 执行 第三个方法======= 不要太纠结以上的代码,以上只是作为抛砖引玉的作用,就算是有执行错误,思路我觉得还是没有问题的,当然确实有很多要优化的地方,比如等待执行的线程一直在耗费cpu资源的情况,可以替换为自旋锁或者混合锁,有兴趣的同学可以进行优化一番。 另辟蹊径 但是,作为语法很优秀的c#怎么能就此止步呢?c#本身提供了Task的机制,可以把它看做是类似golang的协程(虽然不是很像)。基于task的机制我们很容易就完成,task的 ContinueWith机制就是为此而生的,它可以很方便的把多个并行的task串行化,有兴趣的同学可以试一下,但是我要说的并非ContinueWith。既然要执行的顺序化,如果我把执行的代码放在有顺序的容器中,然后按照顺序去执行,岂不快哉?不多废话: class TaskTest { static Func<Task> FirstAction = Methond1; static Func<Task> SecondAction = Methond2; static Func<Task> ThirdAction = Methond3; static Dictionary<int, Func<Task>> ActionDic = new Dictionary<int, Func<Task>>() { { 1, FirstAction }, { 2, SecondAction }, { 3, ThirdAction } }; static Func<Task>[] tList = new Func<Task>[3]; public static void Start() { while (true) { Console.WriteLine("请输入顺序"); var inputStr = Console.ReadLine(); var input = inputStr.Split(",").Select(s => int.Parse(s)); foreach (var i in input) { var method = ActionDic.GetValueOrDefault(i); tList[i-1] = method; } foreach (var t in tList) { t.Invoke().Wait(); } } } static Task Methond1() { return Task.Run(()=> { Console.WriteLine($"{Thread.CurrentThread.Name} 执行 第一个方法=="); }); } static Task Methond2() { return Task.Run(() => { Console.WriteLine($"{Thread.CurrentThread.Name} 执行 第二个方法======="); }); } static Task Methond3() { return Task.Run(() => { Console.WriteLine($"{Thread.CurrentThread.Name} 执行 第三个方法======="); }); } } 测试: 请输入顺序 2,3,1 执行 第一个方法== 执行 第二个方法======= 执行 第三个方法======= 请输入顺序 3,2,1 执行 第一个方法== 执行 第二个方法======= 执行 第三个方法======= 请输入顺序 1,3,2 执行 第一个方法== 执行 第二个方法======= 执行 第三个方法======= 请输入顺序 是不是很爽,毫不犹豫的说c#是一门很优秀的语言,在并发方面做的很优秀。以上Task的代码并非是最优代码,比如 可以用Await来代替 wait(),这样的话在真实环境中可以释放当前线程来提高吞吐量,记住:await方式提高的吞吐量,并非缩短了单次请求的执行时间。 更多精彩文章 分布式大并发系列 架构设计系列 趣学算法和数据结构系列 设计模式系列

优秀的个人博客,低调大师

Kube-OVN v0.9.1 稳定性提升

该版本主要修复0.9.0 版本中反馈的问题,代码会维护两个分支,release分支主要是 bugfix,发布周期会稍微频繁一些,master上会有bugfix和新的功能,想试验新功能可以用 master分支。 问题修复 1. 当子网所有 IP 都被分配,再次分配 IP 会导致 panic 2. kube-ovn-cniserver 挂载 /var/run/netns 目录,避免 kind 集群出现的目录问题 3. 正确处理 svc 中 targetPort 为字符串的情况 4. start-ovs.sh 脚本中的错误 5. 删除节点时回收 ip/route 等资源 6. nbctl 增加超时控制,避免无限阻塞的情况 7. 当子网中还有 IP 使用时,阻塞子网删除操作

优秀的个人博客,低调大师

MetInfo 7.0.0 beta 发布,已稳定,可用于正式网站

软件版本:MetInfo 7.0.0 beta 发布日期:2019-8-3 官方网站:www.metinfo.cn 更新日志: 1、优化系统运行效率,网站访问速度提升50%-80%; 2、新增管理后台手机版,通过手机可以管理网站; 3、重写管理后台框架,优化系统管理功能和管理入口布局; 4、新增metv7默认免费响应式模板一套; 5、优化在线客服功能,新增两种时尚在线客服样式; 6、新增banner按钮功能,可设置自定义按钮样式和数量; 7、新增内容标题、栏目名称颜色、文字大小自定义功能; 8、新增tag标签聚合功能,可单独设置tag的tdk,实现同模块内容的专题功能; 9、优化缩略图设置功能,支持按栏目设置缩率图尺寸; 10、优化产品模块内容页选项卡功能,支持按栏目设置选项卡个数与名称; 11、新增编辑器保存内容时手动保存图片到本地功能; 12、优化编辑器图片在线管理功能,支持按文件夹分类挑选图片; 13、新增手机底部菜单功能,可自定义设置手机底部菜单按钮; 14、新增服务器环境检测功能,用户可自行在后台测试是否支持全部功能; 15、新增后台管理员关键操作日志功能; 16、新增关闭调用系统默认css、js功能,自定义制作模板更灵活; 17、新增301跳转设置开关,可设置不带www的域名自动跳转到www域名; 18、新增logo图片alt、title文字设置功能,更有利于SEO; 19、新增404页面内容自定义功能; 20、新增栏目无内容提示文字自定义功能; 21、新增友情链接可按栏目显示功能; 22、新增管理员发布内容审核功能,可设置管理发文是否需要审核才能显示; 23、新增反馈、留言、招聘模块收到信息自动发送短信提醒管理员功能; 24、新增求职者提交简历后自动短信回复功能; 25、新增栏目及内容“其他和自定义”两个字段,配合部分模板展示更多内容; 26、修改全站文件加载路径为相对路径,部署https前后台自动支持; 27、优化系统搜索标签,支持管理员设置搜索范围及方式; 28、优化内容复制功能,可将选定内容复制到其他语言指定栏目; 29、优化文章模块发布人名称功能,新增发布人独立字段; 30、优化管理员权限功能,支持可视化权限设置; 31、优化管理员找回密码功能,支持手机、邮件找回密码; 32、优化招聘模块栏目设置,支持新增二级栏目及单独设置每个栏目的配置; 33、优化banner功能,新增手机端独立设置功能; 34、优化清除缓存机制,可独立清空系统缓存和缩略图; 35、优化开启伪静态后,动态url自动跳转功能; 36、取消基本信息的网站地址设置,网站搬家和迁移更简单; 37、兼容PHP7.2版本; 38、取消免费版模板解析加密机制,确保开源版本100%开源;

优秀的个人博客,低调大师

搭建mcollective高可用,使puppet架构更加安全、稳定

一、配置Rabbitmq 安装(略),可参考http://kisspuppet.com/2013/11/10/mcollective-middleware/或http://rsyslog.org/2013/11/10/mcollective-middleware/ 1.开启插件rabbitmq_stomp 1 2 3 4 [root@linuxmaster1poc ~]# rabbitmq-plugins enable rabbitmq_stomp The following plugins have been enabled: rabbitmq_stomp Plugin configuration has changed. Restart RabbitMQ for changes to take effect. 2.添加tcp监听端口和范围 1 2 3 4 [root@linuxmaster1poc ~]# vim /etc/rabbitmq/rabbitmq.config [ {rabbitmq_stomp, [{tcp_listeners, [ 61613 ]}]} ]. 备注:可参考http://www.rabbitmq.com/stomp.html 3.创建账户并设置权限 如果你以前配置过,建议将配置清空 1 2 3 4 5 6 7 8 9 [root@linuxmaster1poc ~]# rabbitmqctl stop_app Stopping node rabbit@linuxmaster1poc ... ...done. [root@linuxmaster1poc ~]# rabbitmqctl reset Resetting node rabbit@linuxmaster1poc ... ...done. [root@linuxmaster1poc ~]# rabbitmqctl start_app Starting node rabbit@linuxmaster1poc ... ...done. 删除默认用户guest,添加三个用户(webadmin-http访问用,admin--管理员,mcrabbitmq--mcollective链接用) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@linuxmaster1poc ~]# rabbitmqctl list_users Listing users ... guest [administrator] ...done. [root@linuxmaster1poc ~]# rabbitmqctl delete_user guest Deleting user "guest" ... ...done. [root@linuxmaster1poc ~]# rabbitmqctl add_user mc_rabbitmq 123 .com Creating user "mc_rabbitmq" ... ...done. [root@linuxmaster1poc ~]# rabbitmqctl add_user admin password= 123 .com Creating user "admin" ... ...done. [root@linuxmaster1poc ~]# rabbitmqctl add_user web_admin 123 .com Creating user "web_admin" ... ...done. 设置用户的角色 1 2 3 4 5 6 [root@linuxmaster1poc ~]# rabbitmqctl set_user_tags admin administrator Setting tags for user "admin" to [administrator] ... ...done. [root@linuxmaster1poc ~]# rabbitmqctl set_user_tags web_admin monitoring Setting tags for user "web_admin" to [monitoring] ... ...done. 创建虚拟主机组 1 2 3 [root@linuxmaster1poc ~]# rabbitmqctl add_vhost /mcollective Creating vhost "/mcollective" ... ...done. 设置用户访问虚拟主机组的权限 1 2 3 4 5 6 7 8 9 [root@linuxmaster1poc ~]# rabbitmqctl set_permissions -p "/mcollective" mc_rabbitmq ".*" ".*" ".*" Setting permissions for user "mc_rabbitmq" in vhost "/mcollective" ... ...done. [root@linuxmaster1poc ~]# rabbitmqctl set_permissions -p "/mcollective" admin ".*" ".*" ".*" Setting permissions for user "admin" in vhost "/mcollective" ... ...done. [root@linuxmaster1poc ~]# rabbitmqctl set_permissions -p "/mcollective" web_admin ".*" ".*" ".*" Setting permissions for user "web_admin" in vhost "/mcollective" ... ...done. 重启rabbitmq-server服务 1 2 3 [root@linuxmaster1poc ~]# /etc/init.d/rabbitmq-server restart Restarting rabbitmq-server: SUCCESS rabbitmq-server. 查看用户以及角色是否创建成功 1 2 3 4 5 6 [root@linuxmaster1poc ~]# rabbitmqctl list_users Listing users ... admin [administrator] mc_rabbitmq [] web_admin [monitoring] ...done. 查看虚拟主机组“/mcollective”中所有用户的权限 1 2 3 4 5 6 7 [root@linuxmaster1poc ~]# rabbitmqctl list_permissions -p "/mcollective" Listing permissions in vhost "/mcollective" ... admin .* .* .* mc_rabbitmq .* .* .* web_admin .* .* .* ...done. [root@linuxmaster1poc ~]# 4、登录http://192.168.100.120:15672/设置虚拟主机“/mcollective”的exchanges 默认配置 1 2 3 4 5 6 7 8 9 10 [root@linuxmaster1poc ~]# rabbitmqctl list_exchanges -p "/mcollective" Listing exchanges ... direct amq.direct direct amq.fanout fanout amq.headers headers amq.match headers amq.rabbitmq. trace topic amq.topic topic ...done. 设置后更新配置 1 2 3 4 5 6 7 8 9 10 11 12 [root@linuxmaster1poc ~]# rabbitmqctl list_exchanges -p "/mcollective" Listing exchanges ... direct amq.direct direct amq.fanout fanout amq.headers headers amq.match headers amq.rabbitmq. trace topic amq.topic topic mcollective_broadcast topic mcollective_directed direct ...done. 备注:可参考官网设置https://www.rabbitmq.com/man/rabbitmqctl.1.man.html 二、配置MCollective: 1.配置mcollective client端 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 27 28 29 30 31 32 33 34 35 [root@linuxmaster1poc testing]# cat /etc/mcollective/client.cfg topicprefix = /topic/ main_collective = mcollective collectives = mcollective libdir = /usr/libexec/mcollective logger_type = console #loglevel = debug loglevel = warn # Plugins securityprovider = psk plugin.psk = a36cd839414370e10fd281b8a38a4f48 direct_addressing = 1 connector = rabbitmq plugin.rabbitmq.vhost = /mcollective #虚拟主机 plugin.rabbitmq.pool.size = 2 #设置地址池里有两个mq plugin.rabbitmq.initial_reconnect_delay = 0.01 plugin.rabbitmq.max_reconnect_delay = 30.0 #重连时间 plugin.rabbitmq.use_exponential_back_off = true plugin.rabbitmq.back_off_multiplier = 2 plugin.rabbitmq.max_reconnect_attempts = 0 plugin.rabbitmq.randomize = false plugin.rabbitmq.timeout = - 1 plugin.rabbitmq.pool. 1 .host = 192.168 . 100.120 plugin.rabbitmq.pool. 1 .port = 61613 plugin.rabbitmq.pool. 1 .user = mc_rabbitmq plugin.rabbitmq.pool. 1 .password = 123 .com plugin.rabbitmq.pool. 1 .ssl = false plugin.rabbitmq.pool. 2 .host = 192.168 . 100.121 plugin.rabbitmq.pool. 2 .port = 61613 plugin.rabbitmq.pool. 2 .user = mc_rabbitmq plugin.rabbitmq.pool. 2 .password = 123 .com plugin.rabbitmq.pool. 2 .ssl = false # Facts factsource = yaml plugin.yaml = /etc/mcollective/facts.yaml 2.配置mcollective server端 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [root@linux57poc tmp]# cat /etc/mcollective/server.cfg # --Global-- topicprefix = /topic/ main_collective = mcollective collectives = mcollective libdir = /usr/libexec/mcollective logfile = / var /log/puppet/mcollective.log loglevel = info daemonize = 1 # --rabbitmq Plugins-- securityprovider = psk plugin.psk = a36cd839414370e10fd281b8a38a4f48 direct_addressing = 1 connector = rabbitmq plugin.rabbitmq.vhost = /mcollective plugin.rabbitmq.pool.size = 2 plugin.rabbitmq.initial_reconnect_delay = 0.01 plugin.rabbitmq.max_reconnect_delay = 30.0 plugin.rabbitmq.use_exponential_back_off = true plugin.rabbitmq.back_off_multiplier = 2 plugin.rabbitmq.max_reconnect_attempts = 0 plugin.rabbitmq.randomize = false plugin.rabbitmq.timeout = - 1 plugin.rabbitmq.pool. 1 .host = 192.168 . 100.120 plugin.rabbitmq.pool. 1 .port = 61613 plugin.rabbitmq.pool. 1 .user = mc_rabbitmq plugin.rabbitmq.pool. 1 .password = 123 .com plugin.rabbitmq.pool. 1 .ssl = false plugin.rabbitmq.pool. 2 .host = 192.168 . 100.121 plugin.rabbitmq.pool. 2 .port = 61613 plugin.rabbitmq.pool. 2 .user = mc_rabbitmq plugin.rabbitmq.pool. 2 .password = 123 .com plugin.rabbitmq.pool. 2 .ssl = false # --Puppet provider specific options-- plugin.service.provider = puppet plugin.service.puppet.hasstatus = true plugin.service.puppet.hasrestart = true plugin.puppet.command = puppet agent plugin.puppet.splay = true plugin.puppet.splaylimit = 30 plugin.puppet.config = /etc/puppet/puppet.conf # --Facts-- factsource = yaml ##factsource = facter plugin.yaml = /etc/mcollective/facts.yaml 三、高可用测试 特别注意:节点mcollective的server.cfg中pool是有优先级的,默认数字小的生效,这点需要注意,也就是说当所有节点都连接在MQ2上的时候,启动MQ1,mco命令是无法使用的,因为它在运行的时候连接的是MQ1,而所有节点都连接在MQ2上。 1.停止MQ1,查看切换状态 1.1先看当前的节点连接状态 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 [root@linuxmaster1poc ~]# mco ping #查看连接的节点 linux57poc time= 69.46 ms linux58poc time= 70.05 ms linux64poc time= 70.59 ms ---- ping statistics ---- 3 replies max: 70.59 min: 69.46 avg: 70.03 [root@linuxmaster1poc ~]# mco shell "lsof -i:61613" #查看所有节点监听的端口情况,可以看到目前都连接在linuxmaster1poc上。 Do you really want to send this command unfiltered? (y/n): y Discovering hosts using the mc method for 2 second(s) .... 3 Host: linux64poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 36625 root 6u IPv4 27771 0t0 TCP linux64poc: 40493 ->linuxmaster1poc: 61613 (ESTABLISHED) Host: linux58poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 11060 root 6u IPv4 34046 0t0 TCP linux58poc: 36295 ->linuxmaster1poc: 61613 (ESTABLISHED) Host: linux57poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME ruby 18076 root 6u IPv4 1351365 TCP linux57poc: 24698 ->linuxmaster1poc: 61613 (ESTABLISHED) [root@linuxmaster1poc ~]# /etc/init.d/rabbitmq-server stop Stopping rabbitmq-server: rabbitmq-server. 1.2再次运行mco查看切换状态 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 [root@linuxmaster1poc ~]# mco ping linux58poc time= 73.54 ms linux64poc time= 74.61 ms linux57poc time= 75.39 ms ---- ping statistics ---- 3 replies max: 75.39 min: 73.54 avg: 74.51 [root@linuxmaster1poc ~]# mco shell "lsof -i:61613" Do you really want to send this command unfiltered? (y/n): y Discovering hosts using the mc method for 2 second(s) .... 3 Host: linux58poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 11060 root 6u IPv4 34046 0t0 TCP linux58poc: 36295 ->linuxmaster1poc: 61613 (CLOSE_WAIT) ruby 11060 root 9u IPv4 34137 0t0 TCP linux58poc: 47200 ->linuxmaster2poc: 61613 (ESTABLISHED) Host: linux64poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 36625 root 6u IPv4 27771 0t0 TCP linux64poc: 40493 ->linuxmaster1poc: 61613 (CLOSE_WAIT) ruby 36625 root 8u IPv4 27877 0t0 TCP linux64poc: 37472 ->linuxmaster2poc: 61613 (ESTABLISHED) Host: linux57poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME ruby 18076 root 9u IPv4 1351484 TCP linux57poc: 9309 ->linuxmaster2poc: 61613 (ESTABLISHED) 通过日志查看 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [root@linuxmaster1poc ~]# mco shell "lsof -i:61613" Do you really want to send this command unfiltered? (y/n): y Discovering hosts using the mc method for 2 second(s) .... 3 Host: linux58poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 11428 root 6u IPv4 34283 0t0 TCP linux58poc: 36300 ->linuxmaster1poc: 61613 (CLOSE_WAIT) ruby 11428 root 8u IPv4 34338 0t0 TCP linux58poc: 47205 ->linuxmaster2poc: 61613 (ESTABLISHED) Host: linux57poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME ruby 18447 root 6u IPv4 1351559 TCP linux57poc: 59343 ->linuxmaster1poc: 61613 (CLOSE_WAIT) ruby 18447 root 8u IPv4 1351622 TCP linux57poc: 29757 ->linuxmaster2poc: 61613 (ESTABLISHED) Host: linux64poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 37054 root 4u IPv4 28036 0t0 TCP linux64poc: 37476 ->linuxmaster2poc: 61613 (ESTABLISHED) ruby 37054 root 6u IPv4 27990 0t0 TCP linux64poc: 40497 ->linuxmaster1poc: 61613 (CLOSE_WAIT) 总结:可以看到之前的连接已经变成CLOSE_WAIT,新的连接被建立 2.停止MQ2,启动MQ1查看切换状态 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@linuxmaster2poc rabbitmq]# /etc/init.d/rabbitmq-server stop Stopping rabbitmq-server: rabbitmq-server. [root@linux57poc service]# lsof -i: 61613 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME ruby 18447 root 6u IPv4 1351559 TCP linux57poc: 59343 ->linuxmaster1poc: 61613 (CLOSE_WAIT) ruby 18447 root 8u IPv4 1351622 TCP linux57poc: 29757 ->linuxmaster2poc: 61613 (CLOSE_WAIT) [root@linux58poc ~]# lsof -i: 61613 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 11428 root 6u IPv4 34283 0t0 TCP linux58poc: 36300 ->linuxmaster1poc: 61613 (CLOSE_WAIT) ruby 11428 root 8u IPv4 34338 0t0 TCP linux58poc: 47205 ->linuxmaster2poc: 61613 (CLOSE_WAIT) [root@linux64poc ~]# lsof -i: 61613 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 37054 root 4u IPv4 28036 0t0 TCP linux64poc: 37476 ->linuxmaster2poc: 61613 (CLOSE_WAIT) ruby 37054 root 6u IPv4 27990 0t0 TCP linux64poc: 40497 ->linuxmaster1poc: 61613 (CLOSE_WAIT) [root@linuxmaster1poc ~]# /etc/init.d/rabbitmq-server start Starting rabbitmq-server: SUCCESS rabbitmq-server. 根据plugin.rabbitmq.maxreconnectdelay =30.0,需要过最多30秒,mcollective服务端会重新建立连接请求 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 27 28 29 30 31 32 33 34 35 [root@linuxmaster1poc ~]# tailf / var /log/rabbitmq/rabbit\@linuxmaster1poc.log =INFO REPORT==== 24 -Dec- 2013 :: 11 : 00 : 45 === accepting STOMP connection < 0.332 . 0 > ( 192.168 . 100.126 : 36316 -> 192.168 . 100.120 : 61613 ) =INFO REPORT==== 24 -Dec- 2013 :: 11 : 00 : 45 === accepting STOMP connection < 0.348 . 0 > ( 192.168 . 100.125 : 18945 -> 192.168 . 100.120 : 61613 ) =INFO REPORT==== 24 -Dec- 2013 :: 11 : 00 : 45 === accepting STOMP connection < 0.382 . 0 > ( 192.168 . 100.127 : 40513 -> 192.168 . 100.120 : 61613 ) [root@linuxmaster1poc ~]# mco ping linux58poc time= 70.60 ms linux57poc time= 71.32 ms linux64poc time= 111.56 ms ---- ping statistics ---- 3 replies max: 111.56 min: 70.60 avg: 84.49 [root@linuxmaster1poc ~]# mco shell "lsof -i:61613" Do you really want to send this command unfiltered? (y/n): y Discovering hosts using the mc method for 2 second(s) .... 3 Host: linux58poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 11428 root 6u IPv4 34283 0t0 TCP linux58poc: 36300 ->linuxmaster1poc: 61613 (CLOSE_WAIT) ruby 11428 root 8u IPv4 34338 0t0 TCP linux58poc: 47205 ->linuxmaster2poc: 61613 (CLOSE_WAIT) ruby 11428 root 10u IPv4 34444 0t0 TCP linux58poc: 36316 ->linuxmaster1poc: 61613 (ESTABLISHED) Host: linux57poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME ruby 18447 root 10u IPv4 1351723 TCP linux57poc: 18945 ->linuxmaster1poc: 61613 (ESTABLISHED) Host: linux64poc Statuscode: 0 Output: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 37054 root 4u IPv4 28036 0t0 TCP linux64poc: 37476 ->linuxmaster2poc: 61613 (CLOSE_WAIT) ruby 37054 root 6u IPv4 27990 0t0 TCP linux64poc: 40497 ->linuxmaster1poc: 61613 (CLOSE_WAIT) ruby 37054 root 9u IPv4 28206 0t0 TCP linux64poc: 40513 ->linuxmaster1poc: 61613 (ESTABLISHED) 本文转自凌激冰51CTO博客,原文链接:http://blog.51cto.com/dreamfire/1344492,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册