征服Kestrel+Xmemcached
6043 ワード
続きをつける
Kestrelを征服し、XmemcachedのKestrelに対するサポート実装を紹介します.
Xmemcachedの具体的なコードについては、
Memcachedノート--(二)Xmemcached&Spring統合
ここでは、コードを簡潔にするために、Spring+Xmemcached統合モードを直接使用し、Springのプロファイルを先に示します.
注意:ここではKestrelCommandFactoryを使用します.
注意:KestrelCommandFactoryは、データヘッダに4バイトのflagを追加し、任意のシーケンス可能なタイプを格納することをサポートします.(私の理解ではタグメッセージ長です).送受信双方のClientが異なる場合は、移植性を確保するために、データをStringフォーマットに変換し、このflagを捨てる必要があります!
上記のオプションをオンにすると、シーケンス化操作はサポートされず、Stringタイプのみがサポートされます!!!
付kestrelproperties:
簡単なTestUnitを作成します.
上記のコードでサービスの簡単なテストを行うことができ、Kestrel+Xmemcachedアクセスプロジェクトの参考として実現することができます.
簡単な説明:発注サービスは、データSETをキューKQ中の に継続する.パケット受信サービスは、キューKEからデータをGETし続ける .
キューサービスは、基本的な概念であり、キューが最初にデキューされ、キューが最後にデキューされ、非同期メッセージ伝送に適しています.
Kestrelは基本的にMemcachedプロトコルを参照して、リカバリすることができて、サービスが再起動した後に再起動前のメッセージキューを保存することができることを確保して、つまりメッセージを失うことはありません.
Xmemcahedに頼って、Kestrelクラスタをすることができて、分布式はKestrelサービスを拡張します!
関連工事コード、詳細は添付ファイルを参照してください!
関連リンク:征服Kestrel征服Kestrel+Xmemcached征服Kestrel+Xmemcached+Spring TaskExecutor
Kestrelを征服し、XmemcachedのKestrelに対するサポート実装を紹介します.
Xmemcachedの具体的なコードについては、
Memcachedノート--(二)Xmemcached&Spring統合
ここでは、コードを簡潔にするために、Spring+Xmemcached統合モードを直接使用し、Springのプロファイルを先に示します.
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
>
<!-- http://code.google.com/p/xmemcached/wiki/Spring_Integration -->
<bean
id="memcachedClientBuilder"
class="net.rubyeye.xmemcached.XMemcachedClientBuilder"
p:connectionPoolSize="${kestrel.connectionPoolSize}"
p:failureMode="${kestrel.failureMode}"
>
<!-- XMemcachedClientBuilder have two arguments.First is server list,and
second is weights array. -->
<constructor-arg>
<list>
<bean class="java.net.InetSocketAddress">
<constructor-arg>
<value>${kestrel.server1.host}</value>
</constructor-arg>
<constructor-arg>
<value>${kestrel.server1.port}</value>
</constructor-arg>
</bean>
</list>
</constructor-arg>
<constructor-arg>
<list>
<value>${kestrel.server1.weight}</value>
</list>
</constructor-arg>
<property name="commandFactory">
<bean class="net.rubyeye.xmemcached.command.KestrelCommandFactory" />
</property>
<property name="sessionLocator">
<bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator" />
</property>
<property name="transcoder">
<bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
</property>
</bean>
<!-- Use factory bean to build memcached client -->
<bean
id="memcachedClient"
factory-bean="memcachedClientBuilder"
factory-method="build"
destroy-method="shutdown" />
</beans>
注意:ここではKestrelCommandFactoryを使用します.
<property name="commandFactory">
<bean class="net.rubyeye.xmemcached.command.KestrelCommandFactory" />
</property>
注意:KestrelCommandFactoryは、データヘッダに4バイトのflagを追加し、任意のシーケンス可能なタイプを格納することをサポートします.(私の理解ではタグメッセージ長です).送受信双方のClientが異なる場合は、移植性を確保するために、データをStringフォーマットに変換し、このflagを捨てる必要があります!
<bean
id="memcachedClient"
factory-bean="memcachedClientBuilder"
factory-method="build"
destroy-method="shutdown"
>
<!-- Client , -->
<property
name="primitiveAsString"
value="true" />
</bean>
上記のオプションをオンにすると、シーケンス化操作はサポートされず、Stringタイプのみがサポートされます!!!
付kestrelproperties:
#
kestrel.connectionPoolSize=50
kestrel.failureMode=true
#server1
kestrel.server1.host=10.11.155.24
kestrel.server1.port=22133
kestrel.server1.weight=1
簡単なTestUnitを作成します.
import static junit.framework.Assert.*;
import net.rubyeye.xmemcached.MemcachedClient;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Kestrel
*
* @author Snowolf
* @version 1.0
* @since 1.0
*/
public class KestrelTest {
//
private final static String QUEUE_NAME = "KQ";
private ApplicationContext app;
private MemcachedClient memcachedClient;
/**
* @throws java.lang.Exception
*/
@Before
public void before() throws Exception {
app = new ClassPathXmlApplicationContext("applicationContext.xml");
memcachedClient = (MemcachedClient) app.getBean("memcachedClient");
}
/**
*
*/
@Test
public void send() {
for (int i = 0; i < 100; i++) {
try {
memcachedClient.set(QUEUE_NAME, 0, i);
} catch (Exception e) {
fail(e.getMessage());
e.printStackTrace();
}
}
}
/**
*
*/
@Test
public void receive() {
Integer value;
try {
while (true) {
value = (Integer) memcachedClient.get(QUEUE_NAME);
if (value == null) {
break;
}
System.out.println(value);
}
} catch (Exception e) {
fail(e.getMessage());
e.printStackTrace();
}
}
}
上記のコードでサービスの簡単なテストを行うことができ、Kestrel+Xmemcachedアクセスプロジェクトの参考として実現することができます.
簡単な説明:
キューサービスは、基本的な概念であり、キューが最初にデキューされ、キューが最後にデキューされ、非同期メッセージ伝送に適しています.
Kestrelは基本的にMemcachedプロトコルを参照して、リカバリすることができて、サービスが再起動した後に再起動前のメッセージキューを保存することができることを確保して、つまりメッセージを失うことはありません.
Xmemcahedに頼って、Kestrelクラスタをすることができて、分布式はKestrelサービスを拡張します!
関連工事コード、詳細は添付ファイルを参照してください!
関連リンク:征服Kestrel征服Kestrel+Xmemcached征服Kestrel+Xmemcached+Spring TaskExecutor