- 浏览: 115540 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
ron.luo:
干货,必须得顶。
JAXB使用经验总结 -
csdn_zuoqiang:
能否看下DWR的配置情况?谢谢
结合webservice实现dwr推送 -
友友水:
。。。。不好意思,无心之失,删不掉前一条评论
JAXB使用经验总结 -
友友水:
[/flash][/flash][/flash][/flash ...
JAXB使用经验总结 -
lihong11:
大哥,加加注释好不?看不懂唉
小玩dwr实现服务器推送
因为用memcached集群缓存数据,所以增删服务器节点 对缓存key的影响需要考虑一种策略来实现 数据缓存key所映射的节点变动至最小值(这句话好长啊,就是缓存服务器的增减,对在已经缓存了的数据影响降到最小,比如“test”这个数据之前存在a1节点服务器上,那么增加删除了服务器节点,‘test’依然在 a1上(有可能不在,这个原因可以看以下代码),用10个数据来说明吧,感觉有点只可意会不可言传,10个数据,在节点变化时,尽量只有2个数据发生变动,ok)
下面代码示例:
在测试类中,有几组数据对一致性的测试,当每个真实的服务器节点只有一个虚拟节点时,去掉一台机器,那么这台机器的负荷只会倾倒性的转移到一台服务器上,其他节点数据和负荷不发生变化, 这个验证了: 一致性hash在某个节点变化时,其他节点上的原来的数据依然保持
当每个节点的虚拟节点数增加至200个时, 这时去掉一台服务器节点,这个节点的访问量变为0, 其负载均衡的分摊至每个还存在的服务器节点上,这个验证了:一致性hash还能达到负载均衡,而不会导致某台负荷过重而导致 多米诺(相继挂掉)的效应
下面代码示例:
package com.xll; //服务器对象 public class Server { private String name; private String password; private String ip; private String port; public Server() { } public Server(String name, String password, String ip, String port) { super(); this.name = name; this.password = password; this.ip = ip; this.port = port; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getPort() { return port; } public void setPort(String port) { this.port = port; } @Override public String toString() { return "name:" + name + "ip:" + ip + "port:" + port; } }
package com.xll; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; //server注册,算法生成 public class ServerLoadBalance { private TreeMap<Long, Server> nodes; private List<Server> servers; private final int NODE_NUM = 200; public ServerLoadBalance(List<Server> servers) { super(); this.servers = servers; init(); } private void init() { // 初始化一致性hash环 nodes = new TreeMap<Long, Server>(); for (int i = 0; i != servers.size(); ++i) { // 每个真实机器节点都需要关联虚拟节点 final Server shardInfo = servers.get(i); for (int n = 0; n < NODE_NUM; n++){ // 一个真实机器节点关联NODE_NUM个虚拟节点 Long hash_value = hash("SHARD-" + shardInfo.getIp() + "-NODE-" + n); //System.out.println("第"+i+"个server的hash 散列值="+hash_value); nodes.put(hash_value, shardInfo); } } System.out.println("Finish inited virtual node...."); } /** * 通过key的一致性hash值 得到 相应的 Server对象 * @param key * @return */ public Server getShardInfo(String key) { Long hash_value = hash(key); //System.out.println("key="+key+"的hash值="+hash_value); SortedMap<Long, Server> tail = nodes.tailMap(hash_value); // 沿环的顺时针找到一个虚拟节点 if (tail.size() == 0) { return nodes.get(nodes.firstKey()); } return tail.get(tail.firstKey()); // 返回该虚拟节点对应的真实机器节点的信息 } /** * 一致性hash算法 * @param key * @return */ private Long hash(String key) { ByteBuffer buf = ByteBuffer.wrap(key.getBytes()); int seed = 0x1234ABCD; ByteOrder byteOrder = buf.order(); buf.order(ByteOrder.LITTLE_ENDIAN); long m = 0xc6a4a7935bd1e995L; int r = 47; long h = seed ^ (buf.remaining() * m); long k; while (buf.remaining() >= 8) { k = buf.getLong(); k *= m; k ^= k >>> r; k *= m; h ^= k; h *= m; } if (buf.remaining() > 0) { ByteBuffer finish = ByteBuffer.allocate(8).order( ByteOrder.LITTLE_ENDIAN); // for big-endian version, do this first: // finish.position(8-buf.remaining()); finish.put(buf).rewind(); h ^= finish.getLong(); h *= m; } h ^= h >>> r; h *= m; h ^= h >>> r; buf.order(byteOrder); return h; } }
package com.xll; import java.util.ArrayList; import java.util.List; //主要的测试类 public class TestConsistenHash { public static Server s1 = new Server("ser1", "123", "192.168.216.1", "1"); public static Server s2 = new Server("ser2", "123", "192.168.216.2", "2"); public static Server s3 = new Server("ser3", "123", "192.168.216.3", "3"); public static Server s4 = new Server("ser4", "123", "192.168.216.4", "4"); public static Server s5 = new Server("ser5", "123", "192.168.216.5", "5"); public static List<Server> list = new ArrayList<Server>(); public static int count1 = 0; public static int count2 = 0; public static int count3 = 0; public static int count4 = 0; public static int count5 = 0; public static void main(String[] args) { /** * 可以通过 增加 / 剔除 server来测试 被点击量 的变化 */ list.add(s1); list.add(s2); list.add(s3); list.add(s4); list.add(s5); /** * key的数量为1000个 * * * * 在ServerLoadBalance 的 virtual node 数量NODE_NUM 为200时(这个值能达到负载均衡了,100或更小时还没达到) * 测试的两组数据(5台server和剔除server3时的4台server) * * * server1 hit count = 197 * server2 hit count = 193 * server3 hit count = 210 * server4 hit count = 170 * server5 hit count = 230 * * * server1 hit count = 265 * server2 hit count = 248 * server3 hit count = 0 * server4 hit count = 214 * server5 hit count = 273 * * * * * 在ServerLoadBalance 的 virtual node 数量NODE_NUM 为1时(负载均衡在100或更小时还没达到) * 测试的两组数据(5台server和剔除server3时的4台server) * server1 hit count = 359 * server2 hit count = 94 * server3 hit count = 387 * server4 hit count = 67 * server5 hit count = 93 * * * server1 hit count = 359 * server2 hit count = 481 * server3 hit count = 0 * server4 hit count = 67 * server5 hit count = 93 * * * * */ ServerLoadBalance server = new ServerLoadBalance(list); for (int i = 0; i < 1000; i++) { String key = ""+(i+20); Server s = (Server)server.getShardInfo(key); if(s.toString().equals(s1.toString())) count1 ++; else if(s.toString().equals(s2.toString())) count2 ++; else if(s.toString().equals(s3.toString())) count3 ++; else if(s.toString().equals(s4.toString())) count4 ++; else count5 ++; //System.out.println("key" + i + ", server=" + s); } //得到各server的命中 情况 System.out.println("#############"); System.out.println("server1 hit count = "+TestConsistenHash.count1); System.out.println("server2 hit count = "+TestConsistenHash.count2); System.out.println("server3 hit count = "+TestConsistenHash.count3); System.out.println("server4 hit count = "+TestConsistenHash.count4); System.out.println("server5 hit count = "+TestConsistenHash.count5); System.out.println("#############"); // String key = "test"; // TestThread tt = new TestThread(shard, key); // // new Thread(tt, "0").start(); // new Thread(tt, "10001").start(); // new Thread(tt, "20001").start(); // new Thread(tt, "30001").start(); // new Thread(tt, "40001").start(); // new Thread(tt, "50001").start(); } }
package com.xll; //用于跑大量数据 public class TestThread extends Thread{ ServerLoadBalance shard; String key; public TestThread(ServerLoadBalance shard,String key){ this.shard = shard; this.key = key; } @Override public void run() { runHash(); printCountValue(); } public void runHash(){ String name = currentThread().getName(); int start = Integer.parseInt(name); for (int i = start; i < start+10000; i++) { Server s = (Server)shard.getShardInfo(key+i); increaseCount(s); } } public void increaseCount(Server s){ if(s.toString().equals(TestConsistenHash.s1.toString())) increase(1); else if(s.toString().equals(TestConsistenHash.s2.toString())) increase(2); else if(s.toString().equals(TestConsistenHash.s3.toString())) increase(3); else if(s.toString().equals(TestConsistenHash.s4.toString())) increase(4); else increase(5); } static synchronized void increase(int i){ switch (i) { case 1: TestConsistenHash.count1 ++; break; case 2: TestConsistenHash.count2 ++; break; case 3: TestConsistenHash.count3 ++; break; case 4: TestConsistenHash.count4 ++; break; default: TestConsistenHash.count5 ++; break; } } void printCountValue(){ System.out.println("#############"); System.out.println("server1 hit count = "+TestConsistenHash.count1); System.out.println("server2 hit count = "+TestConsistenHash.count2); System.out.println("server3 hit count = "+TestConsistenHash.count3); System.out.println("server4 hit count = "+TestConsistenHash.count4); System.out.println("server5 hit count = "+TestConsistenHash.count5); System.out.println("#############"); } }
在测试类中,有几组数据对一致性的测试,当每个真实的服务器节点只有一个虚拟节点时,去掉一台机器,那么这台机器的负荷只会倾倒性的转移到一台服务器上,其他节点数据和负荷不发生变化, 这个验证了: 一致性hash在某个节点变化时,其他节点上的原来的数据依然保持
当每个节点的虚拟节点数增加至200个时, 这时去掉一台服务器节点,这个节点的访问量变为0, 其负载均衡的分摊至每个还存在的服务器节点上,这个验证了:一致性hash还能达到负载均衡,而不会导致某台负荷过重而导致 多米诺(相继挂掉)的效应
发表评论
-
动态多数据源实现
2019-12-18 12:58 450背景: 目前基于连接了mobile库 从库的 项目(sprin ... -
RPC调用之微博 motan
2018-02-23 16:42 1512这边文章将偏实战, 至于motan,可以去了解如何实现、比普通 ... -
java快速读取大文件
2018-02-08 11:19 374public static String readCon ... -
微信JSSDK 使用
2016-05-26 11:49 1953获取微信JSAPI_TICKET package com ... -
Netty服务构建实践
2016-05-26 11:40 732用main的形式在服务器上启动了一个netty服务,有端口有地 ... -
安全性,加密
2016-03-07 15:55 660/** * 随机字符串集 */ pri ... -
redis实现并发资源控制--如抢红包、抢优惠券机制
2016-02-20 17:41 8859场景: 如 抢红包、 抢优惠券,都是先到先得 抢红包是把发 ... -
并发队列
2015-12-03 15:26 641import java.util.concurrent ... -
ant脚本编译部署java工程到tomcat服务器
2013-06-28 15:35 1102<?xml version="1.0& ... -
hibernate延迟加载 与 web应用 独立缓存架构的冲突
2013-04-26 11:03 1136延迟加载(Lazy Loading)是 ... -
Myeclipse反向生成pojo及hibernate映射文件(由数据库表)
2013-03-18 14:38 1089在这之前请创建一个web工程,然后右键选择myeclipse- ... -
结合webservice实现dwr推送
2012-08-22 13:26 5323情景: 客户端需要实时提醒服务,比如某个日程已过期的提醒, ... -
手写比较器comparator
2012-07-12 15:47 1298项目中需要对一些数据进行排序,应用到了个比较强大的比较器,感觉 ... -
copy到粘贴板
2012-05-22 11:39 1184直接上代码,实现了IE和火狐下的copy content ... -
取两个集合的交集数据
2011-08-30 11:13 1284List<String> a = new A ... -
常用正则表达式收藏
2011-04-26 12:26 7331。^\d+$ //匹配非负整数(正整数 + 0) 2。 ... -
对日期类型与String类型之间转换方法的小结
2011-03-07 19:25 1268关于日期的方法举例程序如下: package c ... -
线程同步
2011-02-26 10:47 839转自http://www.iteye.com/topic/16 ... -
java多线程
2011-02-26 08:15 918本文转载自 http://www.iteye.com/topi ... -
对java中反射的整理
2011-02-24 20:04 897什么是Java中的类反射: ...
相关推荐
一致性哈希算法是一种分布式系统中负载均衡的策略,它的核心思想是解决在分布式环境中如何将数据均匀地分配到各个节点的问题。Google Maglev论文中提出的一致性哈希算法是为了解决大型数据中心的网络路由问题,使得...
一致性Hash算法,易于扩容;添加了 单元测试,使用Spring提供的RestTemplate调用RestFul风格的API接口;整合了 quartz 定时任务框架 ,并进行了封装,只需在构建完定时任务Job类后,在 application-quartz....
Mycat 一致性哈希分片算法 Mycat是一款开源的数据库中间件,支持各种数据库管理系统,包括 MySQL、 PostgreSQL、Oracle 等。Mycat 的核心功能之一是分片(Sharding),它可以将大量数据分布式存储在多个数据库节点...
一致性哈希算法作为解决这一问题的重要手段之一,近些年来得到了广泛关注和应用。 一致性哈希算法由David Karger等人在1997年提出,它是一种特殊的哈希算法,主要用于分布式系统中实现负载均衡。与传统的哈希算法...
S1.txt和S2.txt是实验中的测试数据,它们可能包含不同内容,用于测试不同输入下哈希算法的正确性和一致性。通过计算这两个文件的哈希值并与预期结果比较,可以验证算法实现的正确性。 综上所述,本次实验旨在理解和...
1. **一致性哈希算法**:一致性哈希是一种解决分布式系统中数据分布问题的算法,它的主要特点是能够尽可能地减少数据迁移。在WebSocket服务的分布式扩展中,一致性哈希用于确定每个连接应该路由到哪个服务器,使得在...
一致性哈希(Consistent Hashing)是一种分布式系统中用于负载均衡的哈希算法。它解决的是分布式系统中如何在服务器节点变更时尽可能均匀地重新分配原有的数据和负载的问题。传统的哈希算法在服务器数量变动时需要重新...
Hash值查看及修改软件,如"Hash_1.0.4_0523.exe"和"HashModifier.exe",是专门用来计算和可能修改文件Hash值的实用工具,对于验证文件的完整性和一致性具有重要意义。 首先,让我们深入了解什么是Hash值。Hash函数...
《深入理解Go语言实现的一致性哈希算法:jump-consistent-hash》 一致性哈希算法在分布式系统中扮演着至关重要的角色,它允许数据在分布式集群中的节点间平滑迁移,确保服务的连续性和可用性。Go语言实现的一致性...
在IT行业中,数据库扩展是解决高并发、大数据量问题的关键策略之一。...虽然简单,但在小型系统中可能适用,但对于大型分布式系统,可能需要更复杂的一致性hash策略来确保数据分布的均衡性和系统的可扩展性。
此提交使用一致性敏感散列 (CSH) 提供图像修复。 为了使用它,您需要来自http://www.eng.tau.ac.il/~simonk/CSH/index.html的 CSH 工具箱 包括一个测试脚本和几个测试图像。
### PHP hash算法 PHP支持多种哈希算法,其中包括但不限于MD2、MD4、MD5、SHA系列(SHA1、SHA224、SHA256、SHA384、SHA512)、RIPEMD系列(128位、160位、256位、320位)、Tiger、Snefru、GOST、Adler32、CRC32、...
ASP HMAC_SHA1 加密方式详解 ...通过正确地实现 ASP 函数并遵循一致性原则,可以在不同编程语言之间实现可靠的跨平台数据验证。`sha1.asp` 和 `sha1.php` 文件可以作为对比测试,帮助开发者检查其 ASP 实现是否正确。
- **兼容性**: 考虑与其他语言或库的 MurMurHash3 实现保持一致,以确保跨平台的一致性。 - **错误处理**: 实现应处理无效的输入,如空字符串、负长度等,并提供清晰的错误信息。 在 `MurMurHash3-master` 压缩包中...
5. `consistent`: 添加此选项可以使用一致性哈希算法,这有助于在添加或删除服务器时减少请求的重新分布。 在部署nginx_upstream_hash模块时,需要注意以下几点: 1. 配置文件中需要正确引入模块,通常在http、...
一致性哈希(Consistent Hashing)是一种分布式存储系统中用于负载均衡和缓存分配的算法。它的主要目标是在节点加入或离开系统时,尽可能减少数据重新分布的影响。在传统的哈希算法中,当新增或移除一个服务器时,...
在IT行业中,尤其是在分布式系统和负载均衡领域,一致性哈希是一种重要的算法,它解决了数据分布和负载均衡的问题。本文将详细探讨"cpp-nginx一致性哈希模块支持虚节点可动态剔除不健康节点"这一主题。 一致性哈希...
9. **测试**:为了确保哈希函数的正确性和一致性,项目可能包含了单元测试,使用了如Jest、Mocha等测试框架。 10. **应用场景**:MurmurHash3在前端项目中可能用于生成唯一ID、数据索引、缓存键、指纹识别等场景。 ...
在数据备份恢复时,可以通过对比备份前后的文件Hash值,验证数据是否一致;在下载文件时,用户可以核对文件的MD5或SHA1值,确保下载的文件与源文件完全相同,避免了因网络问题导致的文件损坏或篡改。 在使用该工具...
MD5的主要目的是确保数据的完整性和一致性,但请注意,由于碰撞攻击的存在,MD5已不再适合用于安全认证。 2. **MD5的四个步骤**:MD5算法主要包括四个步骤:初始化、处理消息块、压缩函数和结果的二进制到十六进制...