我正在寻找一个高性能,并发的MultiMap.我到处搜索但是我找不到使用与ConcurrentHashMap相同的方法的解决方案(仅锁定哈希数组的一部分).
多图表将经常被读取,添加和删除.
multimap键将是一个String,它的值将是任意的.
我需要O(1)来查找给定键的所有值,O(N)可以删除,但O(logN)将是首选.
删除给定键的最后一个值将从键中删除值容器至关重要,以免泄漏内存.
这是我建立的解决方案,在ApacheV2下可用: 索引(多图)
我目前参与的项目中,我们/应用程序需要能够发现具有在LAN上运行的相同应用程序名称的应用程序的其他实例(以下称为节点).
先决条件:所有节点都知道自己的IP地址和TCP端口号所有节点都有一个名称所有节点都可以访问局域网
我需要的:
所有节点都需要知道每个其他节点的IP地址和TCP端口.如果节点出现故障,我将不得不以编程方式通知此情况.如果出现新节点,我将不得不以编程方式通知此情况.它的基本原理是不需要主服务器或其他应用程序,它必须是我可以集成到当前应用程序中的API.此外,它必须是开源的,并且最好是许可的MIT或ApacheV2.
就这样!
该应用程序是基于JVM的,因此任何API都可以.我一直在看ZooKeeper,但它似乎是我们需要的小功能的一个很大的依赖.
并且,如果你不知道任何API,但是有一些很好的链接可以分享如何通过自己编写来实现这一点(白皮书,博客,书籍等等),我会非常乐意接受这样的事情.
所以问题是,我该怎么做?
我浪费了几天时间试图追踪新添加的Akka传输加密中的间歇性错误.
注意:我已经尝试在服务器和客户端中的任何一个或两个上设置setIssueHandshake(true),但它根本没有帮助.
我们的密码规范测试了来自不同套件的几个不同密码,以确保我们支持的设置实际上有效.但是,测试有时会通过10次,然后开始每次测试失败,它确实是SecureRandomly失败;-)请注意,即使在SHA1PRNG上测试也会失败,因此它显然与我们提供的其他密码无关.
创建SslHandler的代码:https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/main/scala/akka/remote/netty/ NettySSLSupport.scala
构造管道的代码:https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/main/scala/akka/remote/netty/ NettyRemoteSupport.scala#L66
测试:https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/test/scala/akka/remote/Ticket1978CommunicationSpec.scala
回退配置(上面的测试没有覆盖的内容):https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/主/资源/ reference.conf
用于测试的密钥库和信任库:https://github.com/akka/akka/tree/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/test/resources
未通过测试的根异常是:
**java.security.InvalidKeyException: No installed provider supports this key: (null)**
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at com.sun.net.ssl.internal.ssl.CipherBox.<init>(CipherBox.java:88)
at com.sun.net.ssl.internal.ssl.CipherBox.newCipherBox(CipherBox.java:119)
at com.sun.net.ssl.internal.ssl.CipherSuite$BulkCipher.newCipher(CipherSuite.java:369)
at com.sun.net.ssl.internal.ssl.Handshaker.newReadCipher(Handshaker.java:410)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.changeReadCiphers(SSLEngineImpl.java:550)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1051)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:845)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:721)
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:607)
at org.jboss.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:969)
at org.jboss.netty.handler.ssl.SslHandler.decode(SslHandler.java:670)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:333)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:214)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:91)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:373)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:247)
at …Run Code Online (Sandbox Code Playgroud)