Master可以同时开着使用开塞露擦脸5年了吗

窃以为,对于zookeeper这种东西,仅仅知道怎么安装是远远不够的(废话么这不是,,,),至少要对其几个典型的应用场景进行了解,才能比较全面的知道zk究竟能干啥,怎么玩儿,以后的日子里才能知道这货如何能为我所用。于是,有了如下的学习:
我们知道zookeeper可以用于搭建高可用服务框架,主要先看以下几个应用场景:1、 master的选举基本思路和编码实现2、 数据的发布和订阅3、 软负载均衡4、 分布式队列5、 分布式锁6、 命名服务
目前zookeeper常用的开发包有zkclient跟curator,后者更为方便,日常开发使用较多。
----------------正文分割线-----------------------------------------------------------
master选举
1、使用场景及结构
  现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作。此类问题现在多采用master-salve模式,也就是常说的主从模式,正常情况下主机提供服务,备机负责监听主机状态,当主机异常时,可以自动切换到备机继续提供服务(这里有点儿类似于数据库主库跟备库,备机正常情况下只监听,不工作),这个切换过程中选出下一个主机的过程就是master选举。
  对于以上提到的场景,传统的解决方式是采用一个备用节点,这个备用节点定期给当前主节点发送ping包,主节点收到ping包后会向备用节点发送应答ack,当备用节点收到应答,就认为主节点还活着,让它继续提供服务,否则就认为主节点挂掉了,自己将开始行使主节点职责。如图1所示:
    & & & & & & & & & & & & & & & & & & & & & & &&& & & & &&
     & & & & & & &图1 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
   但这种方式会存在一个隐患,就是网络故障问题。看一下图2:
          图2
   也就是说,我们的主节点并没有挂掉,只是在备用节点ping主节点,请求应答的时候发生网络故障,这样我们的备用节点同样收不到应答,就会认为主节点挂掉,然后备机会启动自己的master实例。这样就会导致系统中有两个主节点,也就是双master。出现双master以后,我们的从节点会将它做的事情一部分汇报给主节点,一部分汇报给备用节点,这样服务就乱套了。为了防止这种情况出现,我们可以考虑采用zookeeper,虽然它不能阻止网络故障的出现,但它能保证同一时刻系统中只存在一个主节点。我们来看zookeeper是怎么实现的:
  在此处,抢主程序是包含在服务程序中,需要程序员来手动写抢主逻辑的,比如当当开源框架elastic-job中,就有关于选主的部分,参见:elastic-job-core/main/java/com/dangdang/ddframe/job/internal/election文件夹下的选主代码。
  一点额外的话:zookeeper自己在集群环境下的抢主算法有三种,可以通过配置文件来设定,默认采用FastLeaderElection,不作赘述;此处主要讨论集群环境中,应用程序利用master的特点,自己选主的过程。程序自己选主,每个人都有自己的一套算法,有采用&最小编号&的,有采用类似&多数投票&的,各有优劣,本文的算法仅作演示理解使用:
  结构图:
  结构图解释:左侧树状结构为zookeeper集群,右侧为程序服务器。所有的服务器在启动的时候,都会订阅zookeeper中master节点的删除事件,以便在主服务器挂掉的时候进行抢主操作;所有服务器同时会在servers节点下注册一个临时节点(保存自己的基本信息),以便于应用程序读取当前可用的服务器列表。
  选主原理介绍:zookeeper的节点有两种类型,持久节点跟临时节点。临时节点有个特性,就是如果注册这个节点的机器失去连接(通常是宕机),那么这个节点会被zookeeper删除。选主过程就是利用这个特性,在服务器启动的时候,去zookeeper特定的一个目录下注册一个临时节点(这个节点作为master,谁注册了这个节点谁就是master),注册的时候,如果发现该节点已经存在,则说明已经有别的服务器注册了(也就是有别的服务器已经抢主成功),那么当前服务器只能放弃抢主,作为从机存在。同时,抢主失败的当前服务器需要订阅该临时节点的删除事件,以便该节点删除时(也就是注册该节点的服务器宕机了或者网络断了之类的)进行再次抢主操作。从机具体需要去哪里注册服务器列表的临时节点,节点保存什么信息,根据具体的业务不同自行约定。选主的过程,其实就是简单的争抢在zookeeper注册临时节点的操作,谁注册了约定的临时节点,谁就是master。
  ps:本文的例子中,并未用到结构图server节点下的数据。但换一种算法或者业务场景就会用到,算法比如提到的最小编号,主要逻辑是主节点挂掉后,从节点里边编号最小的成为主节点,此时会用到该节点内容。换一种业务场景:集群环境中,有很多任务要处理,&主节点负责接收任务,并根据一定算法将任务分配到不同的机器上执行;这种情况下,主节点跟从节点的职责也是不同的,主节点挂掉也会涉及到从节点进行master选举的问题。这种情况下,很显然,作为主节点需要知道当前有多少个从节点还活着,那么此时也会需要用到servers节点下的数据了。
2、编码实现
&  主要有两个类,WorkServer为主服务类,RunningData用于记录运行数据。因为是简单的demo,我们只做抢master节点的编码,对于从节点应该去哪里注册服务列表信息,不作编码。
  采用zkClient实现,代码如下:
  WorkServer类:
3 import org.I0Itec.zkclient.IZkDataL
4 import org.I0Itec.zkclient.ZkC
5 import org.I0Itec.zkclient.exception.ZkInterruptedE
6 import org.I0Itec.zkclient.exception.ZkNoNodeE
7 import org.I0Itec.zkclient.exception.ZkNodeExistsE
8 import org.apache.zookeeper.CreateM
10 import java.util.concurrent.E
11 import java.util.concurrent.ScheduledExecutorS
12 import java.util.concurrent.TimeU
* Created by nevermore on 16/6/22.
17 public class WorkServer {
//客户端状态
private volatile boolean running = false;
private ZkClient zkC
//zk主节点路径
public static final String MASTER_PATH = "/master";
//监听(用于监听主节点删除事件)
private IZkDataListener dataL
//服务器基本信息
private RunningData serverD
//主节点基本信息
private RunningData masterD
private ScheduledExecutorService delayExector = Executors.newScheduledThreadPool(1);
//延迟时间5s
private int delayTime = 5;
public WorkServer(RunningData runningData){
this.serverData = runningD
this.dataListener = new IZkDataListener() {
public void handleDataChange(String s, Object o) throws Exception {
public void handleDataDeleted(String s) throws Exception {
//takeMaster();
if(masterData != null && masterData.getName().equals(serverData.getName())){//若之前master为本机,则立即抢主,否则延迟5秒抢主(防止小故障引起的抢主可能导致的网络数据风暴)
takeMaster();
delayExector.schedule(new Runnable() {
public void run() {
takeMaster();
},delayTime, TimeUnit.SECONDS);
public void start() throws Exception{
if(running){
throw new Exception("server has startup....");
running = true;
zkClient.subscribeDataChanges(MASTER_PATH,dataListener);
takeMaster();
public void stop() throws Exception{
if(!running){
throw new Exception("server has stopped.....");
running = false;
delayExector.shutdown();
zkClient.unsubscribeDataChanges(MASTER_PATH,dataListener);
releaseMaster();
//抢注主节点
private void takeMaster(){
if(!running) return ;
zkClient.create(MASTER_PATH, serverData, CreateMode.EPHEMERAL);
masterData = serverD
System.out.println(serverData.getName()+" is master");
delayExector.schedule(new Runnable() {//测试抢主用,每5s释放一次主节点
public void run() {
if(checkMaster()){
releaseMaster();
},5,TimeUnit.SECONDS);
}catch (ZkNodeExistsException e){//节点已存在
RunningData runningData = zkClient.readData(MASTER_PATH,true);
if(runningData == null){//读取主节点时,主节点被释放
takeMaster();
masterData = runningD
} catch (Exception e) {
//释放主节点
private void releaseMaster(){
if(checkMaster()){
zkClient.delete(MASTER_PATH);
//检验自己是否是主节点
private boolean checkMaster(){
RunningData runningData = zkClient.readData(MASTER_PATH);
masterData = runningD
if (masterData.getName().equals(serverData.getName())) {
return true;
return false;
}catch (ZkNoNodeException e){//节点不存在
}catch (ZkInterruptedException e){//网络中断
return checkMaster();
}catch (Exception e){//其它
return false;
public void setZkClient(ZkClient zkClient) {
this.zkClient = zkC
public ZkClient getZkClient() {
return zkC
  RunningData类:
3 import java.io.S
* Created by nevermore on 16/6/22.
8 public class RunningData implements Serializable {
private static final long serialVersionUID = 3203630L;
//服务器id
private long
//服务器名称
public long getCid() {
public void setCid(long cid) {
this.cid =
public String getName() {
public void setName(String name) {
this.name =
&  说明:在实际生产环境中,可能会由于插拔网线等导致网络短时的不稳定,也就是网络抖动。由于正式生产环境中可能server在zk上注册的信息是比较多的,而且server的数量也是比较多的,那么每一次切换主机,每台server要同步的数据量(比如要获取谁是master,当前有哪些salve等信息,具体视业务不同而定)也是比较大的。那么我们希望,这种短时间的网络抖动最好不要影响我们的系统稳定,也就是最好选出来的master还是原来的机器,那么就可以避免发现master更换后,各个salve因为要同步数据等导致的zk数据网络风暴。所以在WorkServer中,54-63行,我们抢主的时候,如果之前主机是本机,则立即抢主,否则延迟5s抢主。这样就给原来主机预留出一定时间让其在新一轮选主中占据优势,从而利于环境稳定。
  测试代码:
3 import org.I0Itec.zkclient.ZkC
4 import org.I0Itec.zkclient.serialize.SerializableS
6 import java.io.BufferedR
7 import java.io.InputStreamR
8 import java.util.ArrayL
9 import java.util.L
* Created by nevermore on 16/6/23.
14 public class LeaderSelectorZkClient {
//启动的服务个数
private static final int
CLIENT_QTY = 10;
//zookeeper服务器的地址
private static final String
ZOOKEEPER_SERVER = "localhost:2181";
public static void main(String[] args) throws Exception{
//保存所有zkClient的列表
List&ZkClient& clients = new ArrayList&ZkClient&();
//保存所有服务的列表
List&WorkServer&
workServers = new ArrayList&WorkServer&();
for ( int i = 0; i & CLIENT_QTY; ++i ){
//创建zkClient
ZkClient client = new ZkClient(ZOOKEEPER_SERVER, , new SerializableSerializer());
clients.add(client);
//创建serverData
RunningData runningData = new RunningData();
runningData.setCid(Long.valueOf(i));
runningData.setName("Client #" + i);
//创建服务
WorkServer
workServer = new WorkServer(runningData);
workServer.setZkClient(client);
workServers.add(workServer);
workServer.start();
System.out.println("敲回车键退出!\n");
new BufferedReader(new InputStreamReader(System.in)).readLine();
System.out.println("Shutting down...");
for ( WorkServer workServer : workServers ){
workServer.stop();
} catch (Exception e) {
e.printStackTrace();
for ( ZkClient client : clients ){
client.close();
} catch (Exception e) {
e.printStackTrace();
  两次测试,本地模拟10台server,分别不启用防止网络抖动跟启动防抖动两次测试结果如下:
  未启动防抖动:
  启用防抖动:
  可以看到,未启用的时候,断线后重新选出的主机是随机的,没规律;启用防抖动后,每次选出的master都是id为0的机器。
-----------------------------------------------------------------------------------------------------------------------------
  至此,我们已经通过编码实现了简单的master选举。但是,不知你有没有发现,,,,这个选主过程的代码还真是麻烦啊!
  我们只是做一个demo,其中并未考虑复杂的业务场景,但其中的 &监听,异常 &等代码的处理还是让我觉得有些头大,怎么办?应运而生!
  为了熟悉Apache Curator,接下来,将用curator来实现master选举的demo。&
阅读(...) 评论()用cluster的master可以共享多个worker的全局数据吗? - CNode技术社区
积分: 6875
这家伙很懒,什么个性签名都没有留下。
比如数据保存在一个全局变量 var message里
这样多个woker和 master都同时读写这个数据会不会出错呢?
var cluster = require('cluster');
var io = require('socket.io')();
var numCPUs = require('os').cpus().
console.log(' numCPUs is ',numCPUs);
var connections=0;
if (cluster.isMaster) {
console.log(&master start...&);
// Fork workers.
for (var i = 0; i & numCPUs; i++) {
cluster.fork();
cluster.on('listening',function(worker,address){
console.log('[Master ]listening: worker ' + worker.process.pid +', Address: '+address.address+&:&+address.port);
cluster.on('exit', function(worker, code, signal) {
console.log('[Master]
worker exit ' + worker.process.pid + ' died');
} else if (cluster.isWorker) {
io.on('connection', function(socket) {
console.log('this is process',process.pid);
connections++;
console.log(&client ++&,connections);
socket.on('disconnect', function() {
connections--;
console.log(&client --&,connections);
socket.on('message',function (msg) {
console.log(msg);
io.listen(9000);
&!doctype html&
&html lang=&en&&
&meta charset=&UTF-8&&
&/title&
&script src=&/js/socket.io.js&&&/script&
&/head&
&script type=&text/javascript&&
var socket = io.connect('ws://localhost:9000',{'reconnection':true});
socket.on('message', function(msg){
console.log(msg);
socket.emit('message',{foo:11,bar:22});
&/script&
&/body&
&/html&
这样启动app.js ,用第一个浏览器刷页面,能看到 控制台显示
client ++ 但是第二个浏览器刷页面,没有反应
最简单的办法是使用Redis。所有的worker都 向 Redis 里 写与读 全局数据。Redis也支持事务。我公司的WEB集群目前就是这么做的。什么session与application级的数据都在Redis里。
在Github里,nodejs的Redis Client库很多。如果再配合上async/await,代码就会更漂亮了。
我之前遇到过类似的问题。我的推测是:你的第二个浏览器的web socket连接并没有被Socket.io成功地创建。根据Socket.IO的文档,在集群工作模式下,Socket.IO创建连接要求“黏性会话”。要不然,,在集群模式下,创建web socket连接有概率性的失败。为此,Socket.IO的作者还实现过一个“黏性会话”的模块在github上:
除了TCP握手之外,Socket.IO为保证对IE 10以下浏览器的向下兼容性,Socket.IO自己也有一个握手操作(基于若干个HTTP请求)。虽然这个功能很强大,但是,也给我们带来了额外的限制。
我建议:你把这个黏性会话的功能先加上,再试。
继续测试了一下, 这个负载均衡只有大量请求下才会显示 一两个单个的请求始终是一个Worker来完成
const cluster = require('cluster');
var totalReqs = 0;
if (cluster.isMaster) {
const numCPUs = require('os').cpus().
console.log(numCPUs);
var broadcast = function() {
Object.keys(cluster.workers).forEach(function(i) {
// console.log(cluster.workers[i].process.pid + &:& + totalReqs);
cluster.workers[i].send({total: totalReqs});
for (var i = 0; i & numCPUs; i++) {
var worker = cluster.fork();
worker.on('message', function(msg) {
totalReqs++;
broadcast();
//
console.log(msg+ & master total is :&+totalReqs);
console.log(process.pid);
const http = require('http');
var localReq = 0;
http.createServer((req, res) =& {
process.send(& worker
& + process.pid + &
local is & + localReq + &
sum is & + totalReqs);
res.writeHead(200);
localReq++;
//console.log(&localreq is &+localReq+&
sum is &+totalReqs);
res.end(&local is & + localReq + &
total is & + totalReqs);
}).listen(9000);
process.on('message', function(msg) {
// console.log(msg.total);
totalReqs=msg.
ab -n 1000 -c 100
但是这样只有最后一个worker 会更新
其他的都显示是0
不知道是哪里的代码写错了
这个黏性会话是不是指 socket从连接到断开的整个过程中 就绑定某一个cpu核心 ?
这里的黏性会话指的是:同一个web client始终发请求给同一个web server实例(或 服务进程)。默认配置是:负载均衡器(也就是 你例子中的主进程)“随机转发”或“依次转发”请求给forked worker服务进程。这个和cpu没有关系。
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的信用卡Visa或者Master的在日本可以用吗_百度知道
信用卡Visa或者Master的在日本可以用吗
我有更好的答案
  信用卡Visa或者Master的在日本可以用,但不是很划算。  1、Visa或者Master是人民币+美元的信用卡,刷卡时信用卡组织会先将日元按刷卡当日汇率换成美元计入持卡人美元账户,在日元兑换美元的过程中持卡人会被收取一笔刷卡金额1.5%左右的货币转换费,回国后持卡人需要按照还款日的汇率用人民币购买美元,然后用美元偿还消费金额。在日本刷Visa或者Master卡消费收费包括:  I. 日币转美金的汇率和手续费, 通常由visa 或者master 收取。  II . 美金转人民币的汇率和手续费, 通常由各个发卡行按照还款时的各个银行的汇率收取 。  2、在日本建议使用JCB信用卡。  JCB+银联信用卡(双币信用卡)是最适合不过了。直接用银联信用卡就可以,日本已经有很多商家支持银联通道了,但基本都是在大的商场里面,很多酒店和饭店走的还是JCB通道。使用日元双币信用卡消费,消费日元直接计入日元账户,回国后再购汇还款,不仅能节省一笔货币转换费,还可以省略一次换汇过程,国内日本都可以使用。  单一的JCB信用卡,适合在日本使用,但国内就不行了。
采纳率:86%
来自团队:
可以啊,VISA或者万事达是两个最大的信用卡组织,能刷卡的国家比较多。在日本海淘或者实体店购物都有支持VISA和万事达的。
本回答被提问者采纳
因为日本很多药妆店、电器店还有百货商店都有针对银联卡九折的活动的。而且现在基本所有银行都推出人民币银联结算的EMV信用卡,就是不要汇兑手续费的全币种信用卡,可以开一张带着可以使用的,日本基本90%都覆盖VISA跟MASTER卡另外如果是旅游购物的话建议再带一张银联卡
为您推荐:
其他类似问题
您可能关注的内容
visa 信用卡 master的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Logitech MX Master长期使用感受
我的图书馆
Logitech MX Master长期使用感受
最近突然发现MX Master的推广软文随处可见,又突然想起入手这货已经快一个月了,看不惯很多文章里面把这款鼠标吹上天,所以简单写下使用感受吧。1. 现有的Logitech鼠标(对比参照对象):目前手上有这么四款Logitech的鼠标(M950和M215分别在父母那儿,这次就不提了),分别是G500、G9x、G700以及MX Master。以上鼠标,如果只论手感,其实G700和G500都还是挺不错的,至少很符合我的手型和使用习惯。G9x其实也还不错,特别是用上大号外壳之后。虽然屁股比较翘,但由于高度较低,所以不会出现Razer巨蝮蛇那种无法忍受的恶劣手感。在入手MX Master之前,我每天的随身携带办公鼠标是G700。可能有人会觉得奇怪,为啥要用一个游戏鼠,而且是续航这么短的游戏鼠来办公?原因如下:1. 无线2. DPI高,可应付高分辨率屏幕的需求3. 手感不错4. 滚轮切换和使用都很顺手(其实G500的滚轮手感更合我口味,切换也方便,无奈不是无线鼠标)5. 可自定义按键较多那么为啥要下放G700,入这么个MX Master呢?1. 怀念M950的手感,而MX Master是M950的替代产品2. 续航时间长3. 据说电磁滚轮用起来更方便4. 有侧向滚轮,在各类软件里面比4向中键更方便5. Dark Field无界引擎确实很不错6. 可配对多台机器,不需要在多个鼠标之间来回切换7. 纯属闲得蛋疼想折腾2. 外观及手感:开箱图之类的就不放了,毕竟这篇文章不是以晒为目的的。单从造型来说,MX Master看起来还是很霸气的,至少像是一款旗舰鼠标。第一眼看上去,基本可以不看Logo就知道这是Logitech的产品。MX Master的部分外壳颜色实际上是香槟色,在特定灯光条件下面会变成类似古铜色的颜色,反而更多了一些质感,然而这并没有什么卵用。鼠标整体的体积跟G700、M950之类的相仿,并且依然拥有面积“巨大”的拇指停放区。MX Master在造型设计上跟Logitech大部分人体工程鼠标的明显区别在于,背部隆起比较高,并且手握上鼠标之后可以发现,最高的位置实际上是在手指第三关节的后面而不是前面(G700、M950则是隆起最高的部分处于第二关节和第三关节之间)。简单点说,就是MX Master隆起的最高部分更靠后。这样的设计,直接效果就是在使用MX Master时,如果要完全握住鼠标(人体工学鼠标不就需要这样用么?)你很难将手腕靠在鼠标垫或桌面上,手腕会一直抬着。有人会说那就试试别完全握住鼠标,手往后退点不就行了?好吧,我的手从指尖到手腕大约是20cm的长度,不知道算不算大手,但肯定不小。而我要想以上述方式使用MX Master,却发现依然很不舒服:首先是使用滚轮时,手指需要刻意往前够,动作不自然,二是手心是空的,用久了也挺累。既然这样,为什么不选一款非人体工学鼠标来用呢?滚轮方面,中键滚轮的手感没有想象中的好,主要是由于处于刻度模式下的滚轮太松,此时按下滚轮使用中键功能,很容易误操作。如果除开这点,这个滚轮能吐槽的地方还真找不出来了(至少对我来说是这样)。在自动切换模式下,小幅度滚动滚轮,滚轮依然是刻度模式。用力滚动滚轮,会自动切换到无刻度的飞梭模式,实测稍微大力点,这个滚轮可以欢快地滚动至少30秒.......自动切换的灵敏度在控制软件里面可以调节,也可以将滚轮锁定到某一种模式下。侧面滚轮的手感非常不错,带有非常合适的阻尼感,无刻度在Excel、Photoshop之类的软件里面简直可以说是神器,试用熟练之后代替轨迹球问题不大。微动行程较短,较软,声音不是特别清脆,但手感还算干净利落,中规中矩吧。侧键需要吐槽。以往的罗技鼠标,侧键无论位置还是面积都很合理很顺手,但MX Master的侧键改为两个小三角形,并且位置非常靠后。要操作侧键,就又需要用异常别扭的动作去点击。使用一周逐渐熟悉之后,侧键操作勉强可以接受,但依然比不上以往Logitech的任何人体工学鼠标。重量方面,由于内置锂电的原因,MX Master重量接近装上AA电池之后的G700,比配重全装之后的G9x和G500都要轻。3. 配对、光学引擎及响应先说这个引擎吧。什么都好,也不丢帧,各种表面的适应性也是绝佳,但不能忍的是DPI太低太低,只有1600 DPI。如果说M950以及M950t的DPI低是因为年代久远,MX Master继续这么干完全是有些脑残了。如果有人跟我一样一台电脑会有多个鼠标换着用(特别是有主流以及高端游戏鼠标的话),那完全就是要变成人格分裂。2K分辨率的屏幕下,MX Master的1600 DPI加上操作系统调节指针速度,勉强可以应付。如果是4K显示器的用户,可以直接无视掉这款鼠标了。关于配对:MX Master可以同时与三台设备配对,但需要通过鼠标底部的按钮依次进行切换.......有一个脑残设计。既然允许用户随时切换配对的设备,当然就是为了通过尽可能快的方式让用户进行切换操作,从而无缝控制多台设备。把切换开关放到底部,还需要抬起鼠标、把鼠标翻过来、用另一只手去按这个开关,把鼠标翻回去,再把鼠标放回鼠标垫。这样糟糕的体验,就类似当初Logitech把某些鼠标(例如G9x)的滚轮模式切换键放到底部一样,必须差评100次。关于配对的其他方面,无论是优联适配器还是蓝牙,体验都还不错,但优联肯定更胜一筹。一是蓝牙必然会多少受到USB 3.0、WiFi等因素的影响,二是蓝牙的省电机制会让鼠标在较长时间未使用之后处于休眠状态,再次作出反应之前,会有几秒钟的延迟。4. 续航初次使用时,内置电池还有一些剩余电量,指示灯显示为两格。使用大半个月之后提示电量低,又过了几个小时彻底停工。充电倒是很快,使用USB 3.0大概只需要2小时左右即可充满。值得一提的是,MX Master不像G700那样拥有无线和有线两种工作模式,而只有无线模式。因此把MX Master插到任何一台机器上充电,也可以通过底部的按键切换去控制另一台机器,这点倒是很不错。5. Bug罗技的软件一直以来都还做得不错,无论是功能还是体验上,Bug也很少。而这次MX Master的Bug出现在Mac平台上,具体说就是对这颗自动切换滚轮的控制。在Mac下面(包括从配对的Windows机器切换到配对的另一台Mac上),这颗滚轮始终是松垮垮的手感,刻度感极其不清晰,甚至有些时候,注意是有些时候可以用十分微弱来形容。要让滚轮的刻度感从十分微弱状态恢复到松垮垮的状态,你只能多次用力滚动滚轮,让滚轮进入自由转动状态,再突然用手指停住滚轮。此时MX Master里面的滚轮刻度机构也许有机会重新将滚轮稍微卡住一点。但总体说来,Mac下的滚轮手感与Windows下面是差距相当大的。6. 保修政策之所以多年来一直选择Logitech的外设(主要是鼠标),很重要一个原因就是保修政策。之前任何Logitech的设备都一视同仁三年质保,并且出问题就换新(虽然也有不少人去钻这个空子,用旧了就找个理由换个新的)。如今MX Master质保期缩短到一年,再加上Logitech的售后政策逐渐以维修代替换新,Logitech被广大用户称赞的售后环节也逐渐失去优势。也正因为如此,我果断放弃等待行货上市的想法,直接入了港版。人品好点呢,用个三五年什么问题也没有,人品稍微差点,也就是自己动手换个微动的事情。人品要是实在不好,鼠标直接翘辫子,那就自认倒霉算了,不过这样的情况,至少一次都还没出现在我使用过的任何鼠标上。
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢}

我要回帖

更多关于 使用开塞露擦脸5年了 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信