征服Kestrel+Xmemcached


続きをつける
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アクセスプロジェクトの参考として実現することができます.
簡単な説明:
  • 発注サービスは、データSETをキューKQ中の
  • に継続する.
  • パケット受信サービスは、キューKEからデータをGETし続ける
  • .
    キューサービスは、基本的な概念であり、キューが最初にデキューされ、キューが最後にデキューされ、非同期メッセージ伝送に適しています.
    Kestrelは基本的にMemcachedプロトコルを参照して、リカバリすることができて、サービスが再起動した後に再起動前のメッセージキューを保存することができることを確保して、つまりメッセージを失うことはありません.
    Xmemcahedに頼って、Kestrelクラスタをすることができて、分布式はKestrelサービスを拡張します!
    関連工事コード、詳細は添付ファイルを参照してください!
    関連リンク:征服Kestrel征服Kestrel+Xmemcached征服Kestrel+Xmemcached+Spring TaskExecutor