首页 文章 精选 留言 我的

精选列表

搜索[扩展更新],共10011篇文章
优秀的个人博客,低调大师

一次Zookeeper 扩展之殇

一、背景 基于公司发展硬性需求,生产VM服务器要统一迁移到ZStack 虚拟化服务器。检查自己项目使用的服务器,其中zookeeper集群中招,所以需要进行迁移。 二、迁移计划 为了使迁移不对业务产生影响,所以最好是采用扩容 -> 缩容 的方式进行。 说明: 1.原生产集群为VM-1,VM-2,VM-3组成一个3节点的ZK集群; 2.对该集群扩容,增加至6节点(新增ZS-1,ZS-2,ZS-3),进行数据同步完成; 3.进行缩容,下掉原先来的三个节点(VM-1,VM-2,VM-3); 4.替换nginx解析地址。 OK! 目标很明确,过程也很清晰,然后开干。 三、步骤 (过程已在测试环境验证无问题): 对新增的三台服务器进行zk环境配置,和老集群配置一样即可,最好使用同一版本(版主使用的是3.4.6); 对老节点的zoo.cfg 增加新

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

扩展Spring Cloud Feign 实现自动降级

自动降级目的 在Spring Cloud 使用feign 的时候,需要明确指定fallback 策略,不然会提示错误。 先来看默认的feign service 是要求怎么做的。feign service 定义一个 factory 和 fallback 的类 @FeignClient(value = ServiceNameConstants.UMPS_SERVICE, fallbackFactory = RemoteLogServiceFallbackFactory.class) public interface RemoteLogService {} 但是我们大多数情况的feign 降级策略为了保证幂等都会很简单,输出错误日志即可。类似如下代码,在企业中开发非常不方便 @Slf4j @Component public class Rem

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

synchronized的功能的扩展:重入锁

重入锁 重入锁可以说是synchronized,Object.wait(),Object.notify()的一种替代品。 在JDK5的早期版本,重入锁的新能要比synchronized好很多,在JDK6后对synchronized进行可很多优化,使得他和重入锁的性能差距并不大。 重入锁使用java.util.concurrent.locks.ReentrantLock类实现,下面我么来看下重入锁的简单使用案例: import java.util.*; import java.util.concurrent.locks.ReentrantLock; public class ReenterLock implements Runnable { public static ReentrantLock lock=new ReentrantLock(); public static int i=0; @Override public void run() { // TODO Auto-generated method stub for(int j=0;j<10000000;j++) { lock.lock(); try { i++; }finally { lock.unlock(); } } } public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub ReenterLock tl=new ReenterLock(); Thread t1=new Thread(tl); Thread t2=new Thread(tl); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(i); } } 运行程序可以得到结果为20000000. 重入锁具有很高的灵活性,需要开发人员手动用lock()与unlock()函数来指定何时加锁何时解锁,但是需要注意的是,在离开临界区的时候要记得释放锁,否则其他线程就没有机会在访问临界区了。(之所以叫重入锁是因为这种锁可以反复进入,但是记得一个线程同时获得多少锁,也必须释放相同的次数) 重入锁除了使用上的灵活性,还有一些高级的功能。 中断响应 对于synchronized来说,如果一个线程在等待锁,那么结果只有两种情况,要么获得锁继续执行,要么保持等待。但是使用重入锁。则提供了另外一种可能,就是线程可以被中断。也就是说,在等待锁的过程中,线程可以取消对锁的请求。有些时候这么做是很有必要的,比如和好朋友约好去打球,等了半小时没到,街道电话得知朋友临时有事,不能来了,那么就打道回府了。这种情况对于处理死锁有一定的帮助。使用lockInterruptibly()函数表示重入锁可以响应中断。 锁申请限时等待 除了等待外部通知外,要避免死锁还有一种办法,就是限时等待。我么可以通过tryLock方法进行一次限时的等待。 try{ if(lock.tryLock(5,TimeUnit.SECONDS)){ Thread.sleep(6000); }else{ System.out.println("get lock failed"); } }catch(InterruptdeException e){ e.printStackTrace(); }finally{ if(lock.isHeldByCurrentThread()) lock.unlock();} } 上面代码中,设置的5秒的限时等待,由于睡眠了6秒,或导致请求锁失败。tryLock也可以不带参数进行运行,这种情况下,线程会尝试获得锁,如果锁未被其他线程占用,申请锁成功,返回true,否则申请失败,线程也不会进行等待,直接返回false。 公平锁 大多数情况下锁是不公平的,也就是说不一定先请求就先获得锁,使用synchronized关键字实现锁,锁就是不公平的,重入锁可以实现公平锁,避免现象,也就是说,只要你排队,就能获得锁,但是由于需要维护一个有序队列,导致公平锁的实现成本比较高,性能相对也非常低下。重入锁有如下一个构造函数:public ReentrantLock(boolean fair)当参数为true时锁是公平的的。 重入锁的好搭档:Condition条件 Condition与Object.wait(),Object.notify()方法的作用大致相同,只不过是用来与重入锁相关联的。通过Lock接口(出入锁就实现乐这一接口)的Condition newCondition()方法可以生成与当前重入锁对象绑定的Condition实例,利用Condition对象,我们可以让线程在特定的时刻进行等待,或者在某一个特定的时刻得到通知,继续执行。Condition接口提供的方法如下。 void await() throws InterrupttedExceptionI; void awaitUninterruptibly(); long awaitNanos(long nanosTimeout) throws InterrupttedExceptionI; boolean await(long time,TimeUnit unit) throws InterrupttedExceptionI; boolean awaitUntil(Date deadline) throws InterrupttedExceptionI; void signal(); void siganlAll(); 以上个方法的含义如下: await()方法会使当前线程等待,同时会释放锁,当其他线程中使用signal()或signalAll()方法的时候,线程会重新获得锁继续执行。或者线程被中断是也能跳出等待。 awaitUninterruptibly()方法与await()方法基本相同,但是他不会在等待过程中相应或者相应中断。 signal()用于唤醒一个在等待中的线程,同理signalAll()用于唤醒所有在等待中的线程。

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

php 利用pcntl扩展实现高并发

pcntl_fork官方描述:pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。 通过一段代码来理解pcntl_fork如何进行多进程并发执行的 $i = 2; while($i >= 0){ $pid = pcntl_fork(); if($pid > 0){ //当前处于父进程中 }elseif($pid == 0){ //这里是子进程逻辑 exit();//子进程跑完了必须退出。否则子进程会继续执行循环创建新的进程 }else{ //进程创建失败 } 当前进程通过pcntl_fork创建了一个子进程,创建完成后当前进程继续执行,此时$pid为创建子进程的进程id所以会进入pid > 0 的判断区块。同时,当父进程执行pcntl_fork时,php又会重新开启一个进程。该进程会拷贝父进程的变量,并且从pcntl_fork之后开始执行,因为进程为子进程,所以pid为0,会执行pid==0里面的逻辑。子进程逻辑跑完了建议退出,否则会继续执行while循环。 100个号码批量分成10个进程发送示例 //随机取100条数据 $mobileList = ['135***','139***',...,'152*****']; insert($data); function insert(array $phoneList){ $cnt = count($phoneList); //测试数组大小 $slice = 10; //需要调用的进程数量 $master = array_chunk($phoneList,floor($cnt/(10))); $childList = []; echo "进程开始\r\n"; while($slice > 0) { $pid = pcntl_fork(); if($pid > 0){ $childList[$pid] = 1; echo $pid."\r\n"; //$pid>0表示当前还在执行父进程的代码 //这里最好啥都不做,每次执行pcntl_fork都会执行这里的代码。 //这里的代码执行完之后 会将$pid设置为0,然后jump到pcntl_fork代码之后,重新做判断; }elseif($pid == 0){ //这里写我们的逻辑 foreach($master[$slice-1] as $val) { sendMessage();//发送短信 } //子进程执行完之后务必需要关闭; exit(); }else { //程序发生错误也需要关闭程序 exit(); } $slice--; } // 等待所有子进程结束后回收资源 while(!empty($childList)){ $childPid = pcntl_wait($status); if ($childPid > 0){ unset($childList[$childPid]); } } }

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册