+doc document ByteBufferSerializer for Artery #21601

This commit is contained in:
Konrad Malawski 2016-09-30 15:29:05 +02:00
parent aeffb380fc
commit e7ed0a2e6b
6 changed files with 131 additions and 4 deletions

View file

@ -168,6 +168,7 @@ abstract class SerializerWithStringManifest extends Serializer {
*
* }}}
*/
//#ByteBufferSerializer
trait ByteBufferSerializer {
/**
@ -182,6 +183,7 @@ trait ByteBufferSerializer {
def fromBinary(buf: ByteBuffer, manifest: String): AnyRef
}
//#ByteBufferSerializer
/**
* Base serializer trait with serialization identifiers configuration contract,

View file

@ -0,0 +1,60 @@
/*
* Copyright (C) 2016 Lightbend Inc. <http://www.lightbend.com>
*/
package docs.actor;
//#bytebufserializer-with-manifest
import akka.serialization.ByteBufferSerializer;
import akka.serialization.SerializerWithStringManifest;
//#bytebufserializer-with-manifest
import java.nio.ByteBuffer;
public class ByteBufferSerializerDocTest {
static //#bytebufserializer-with-manifest
class ExampleByteBufSerializer extends SerializerWithStringManifest
implements ByteBufferSerializer {
@Override
public int identifier() {
return 1337;
}
@Override
public String manifest(Object o) {
return "serialized-" + o.getClass().getSimpleName();
}
@Override
public byte[] toBinary(Object o) {
final ByteBuffer buf = ByteBuffer.allocate(256); // in production code, aquire this from a BufferPool
toBinary(o, buf);
buf.flip();
final byte[] bytes = new byte[buf.remaining()];
buf.get(bytes);
return bytes;
}
@Override
public Object fromBinary(byte[] bytes, String manifest) {
return fromBinary(ByteBuffer.wrap(bytes), manifest);
}
@Override
public void toBinary(Object o, ByteBuffer buf) {
// Implement actual serialization here
}
@Override
public Object fromBinary(ByteBuffer buf, String manifest) {
// Implement actual deserialization here
return null;
}
}
//#bytebufserializer-with-manifest
}

View file

@ -1231,7 +1231,7 @@ returned value downstream.
**completes** when any upstream completes
zipWithIndex
^^^^^^^
^^^^^^^^^^^^
Zips elements of current flow with its indices.
**emits** upstream emits an element and is paired with their index

View file

@ -0,0 +1,41 @@
/*
* Copyright (C) 2016 Lightbend Inc. <http://www.lightbend.com>
*/
package docs.actor
//#bytebufserializer-with-manifest
import java.nio.ByteBuffer
import akka.serialization.ByteBufferSerializer
import akka.serialization.SerializerWithStringManifest
//#bytebufserializer-with-manifest
class ByteBufferSerializerDocSpec {
//#bytebufserializer-with-manifest
class ExampleByteBufSerializer extends SerializerWithStringManifest with ByteBufferSerializer {
override def identifier: Int = 1337
override def manifest(o: AnyRef): String = "naive-toStringImpl"
// Implement this method for compatibility with `SerializerWithStringManifest`.
override def toBinary(o: AnyRef): Array[Byte] = {
val buf = ByteBuffer.allocate(256) // in production code, aquire this from a BufferPool
toBinary(o, buf)
buf.flip()
val bytes = Array.ofDim[Byte](buf.remaining)
buf.get(bytes)
bytes
}
// Implement this method for compatibility with `SerializerWithStringManifest`.
override def fromBinary(bytes: Array[Byte], manifest: String): AnyRef =
fromBinary(ByteBuffer.wrap(bytes), manifest)
// Actual implementation in the ByteBuffer versions of to/fromBinary:
override def toBinary(o: AnyRef, buf: ByteBuffer): Unit = ??? // implement actual logic here
override def fromBinary(buf: ByteBuffer, manifest: String): AnyRef = ??? // implement actual logic here
}
//#bytebufserializer-with-manifest
}

View file

@ -414,7 +414,31 @@ For more information please see :ref:`serialization-scala`.
ByteBuffer based serialization
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TODO
Artery introduces a new serialization mechanism which allows the ``ByteBufferSerializer`` to directly write into a
shared :class:`java.nio.ByteBuffer` instead of being forced to allocate and return an ``Array[Byte]`` for each serialized
message. For high-throughput messaging this API change can yield significant performance benefits, so we recommend
changing your serializers to use this new mechanism.
This new API also plays well with new versions of Google Protocol Buffers and other serialization libraries, which gained
the ability to serialize directly into and from ByteBuffers.
As the new feature only changes how bytes are read and written, and the rest of the serializatio infrastructure
remained the same, we recommend reading the :ref:`serialization-scala` documentation first.
Implementing an :class:`akka.serialization.ByteBufferSerializer` works the same way as any other serializer,
.. includecode:: ../../../akka-actor/src/main/scala/akka/serialization/Serializer.scala#ByteBufferSerializer
Implementing a serializer for Artery is therefore as simple as implementing this interface, and binding the serializer
as usual (which is explained in :ref:`serialization-scala`).
Implementations should typically extend ``SerializerWithStringManifest`` and in addition to the ``ByteBuffer`` based
``toBinary`` and ``fromBinary`` methods also implement the array based ``toBinary`` and ``fromBinary`` methods.
The array based methods will be used when ``ByteBuffer`` is not used, e.g. in Akka Persistence.
Note that the array based methods can be implemented by delegation like this:
.. includecode:: code/docs/actor/ByteBufferSerializerDocSpec.scala#bytebufserializer-with-manifest
Disabling the Java Serializer
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -503,7 +527,7 @@ helpful to separate actors that have different QoS requirements: large messages
Akka remoting provides a dedicated channel for large messages if configured. Since actor message ordering must
not be violated the channel is actually dedicated for *actors* instead of messages, to ensure all of the messages
arrive in send order. It is possible to assign actors on given paths to use this dedicated channel by using
path patterns:
path patterns::
akka.remote.artery.large-message-destinations = [
"/user/largeMessageActor",

View file

@ -1223,7 +1223,7 @@ returned value downstream.
**completes** when any upstream completes
zipWithIndex
^^^^^^^
^^^^^^^^^^^^
Zips elements of current flow with its indices.
**emits** upstream emits an element and is paired with their index