Time |
S |
Nick |
Message |
06:20 |
|
|
abba joined ##friendlyjava |
07:36 |
|
|
aditsu joined ##friendlyjava |
07:42 |
|
|
aditsu joined ##friendlyjava |
09:16 |
|
pulsar |
guys. i am evaluating low latency high throughtput cache backends to basically pass an byte[] stream across jvm instnaces without buffering too much. |
09:18 |
|
pulsar |
i was thinking about redis and implementing a kind of a a blocking byte array output stream (unblocking when the consumer has read enough data to make room for another chunck) |
09:18 |
|
pulsar |
any other ideas, perhaps something less hacky? |
09:20 |
|
pulsar |
i am not so eager to implement chunking myself and would rather use an existing, well tested backend to handle the stream multiplexing for me. |
09:20 |
|
aditsu |
pulsar: there are many options.. are you sure you want a cache and not just a queue of messages? |
09:21 |
|
pulsar |
amqp / mqtt / stop - on my radar right now, did not look very deep into it yet. |
09:21 |
|
pulsar |
and yes, forget i mentioned the cache word |
09:21 |
|
pulsar |
conceptually it is about streams |
09:22 |
|
pulsar |
and does not need to be cached. perhaps for debugging but not as a requirement for the system i need to implement. |
09:22 |
|
aditsu |
well, you can check out things like Chronicle or Mappedbus |
09:22 |
|
pulsar |
zeromq ... i worked with that once. might be also a viable solution. |
09:23 |
|
aditsu |
there are various mq's too |
09:23 |
|
pulsar |
thanks, i will take a look at these. |
09:23 |
|
pulsar |
i like zeromq since it is a very basic, low level mq almost ideal for my needs... now that i look at it :) |
09:23 |
|
aditsu |
I used ActiveMQ some years ago |
09:23 |
|
pulsar |
at least from what i remember from a couple of years ago |
09:24 |
|
pulsar |
i used / use rabbit. did not measure the latency though |
09:24 |
|
aditsu |
oh, does it need to work over the network? or just on the same machine? |
09:24 |
|
pulsar |
clustered, so network. |
09:25 |
|
pulsar |
so no pipes or shm |
09:25 |
|
aditsu |
ok.. Mappedbus might not be suitable then |
09:25 |
|
pulsar |
and i would rather skip the manual chunking if possible |
09:26 |
|
pulsar |
if i was going to use a mq - i would have to deal with that most likely |
09:26 |
|
pulsar |
and somehow impelment the buffer caps / blocking |
09:26 |
|
aditsu |
you can also look into JGroups |
09:26 |
|
pulsar |
either on the protocl level or by a secondard control channel. |
09:26 |
|
pulsar |
jgroups... wow. that has been a while |
09:26 |
|
pulsar |
like 10 years :) |
09:27 |
|
pulsar |
and from what i remember: PITA to configure |
09:27 |
|
pulsar |
due to multicast / network realted foo |
09:27 |
|
aditsu |
it's been updated, but I also haven't used it recently |
09:28 |
|
pulsar |
i think i will take a look at mappedbus and then maybe evaluate zeromq |
09:28 |
|
pulsar |
thanks! |
09:28 |
|
pulsar |
oh, mappedbus seems to be shm |
09:29 |
|
pulsar |
so single machine |
09:29 |
|
aditsu |
I'm afraid Mappedbus doesn't do network, try Chronicle |
09:29 |
|
pulsar |
yeah, it doesnt |
09:29 |
|
aditsu |
or the other things I mentioned |
09:30 |
|
pulsar |
https://github.com/OpenHFT/Chronicle-Queue this one? |
09:31 |
|
aditsu |
yeah.. don't know much about it, it also does memory-mapped stuff, but seems to support network too |
09:31 |
|
aditsu |
I guess there's also stuff like Netty and MINA |
09:34 |
|
pulsar |
i am familiar ... soft of with netty |
09:34 |
|
aditsu |
btw I was considering Mappedbus or Chronicle recently for IPC on the same machine.. but in my case simplicity (and light weight) is much more important than performance |
09:35 |
|
aditsu |
and just now I finished coding something with file locks and WatchService |
09:35 |
|
aditsu |
(I don't want sockets) |
09:46 |
|
pulsar |
file locks... no trouble with that? |
09:46 |
|
pulsar |
depending on the filesystem you might run into issues, been there, done that :) |
09:47 |
|
pulsar |
and switched to zookeper |
09:47 |
|
aditsu |
what kind of trouble? |
09:47 |
|
pulsar |
the deployment target was running on nfs |
09:47 |
|
pulsar |
and that had some issues with locks |
09:48 |
|
pulsar |
like... delayed or something |
09:48 |
|
pulsar |
cant remember exaclty, it is a couple of years ago. |
09:48 |
|
pulsar |
basically i ran into race conditions because of that |
09:48 |
|
pulsar |
and switching to zookeeper (even a single-instance-quorum) was quite easy to implement |
09:49 |
|
pulsar |
and actually meant to be used for cluster-locks |
09:49 |
|
aditsu |
nfs? I wouldn't touch that with a 20-meter pole |
09:49 |
|
pulsar |
yeah, tell that to the guys managing the systems i had to deploy my stuff on :) |
09:50 |
|
pulsar |
"it is just a filesystem, you should not care". |
09:50 |
|
pulsar |
right. |
09:51 |
|
aditsu |
my program is for end users to run on their computers, and I'm only locking files in the temp dir |
09:51 |
|
aditsu |
if they have their tmp on nfs... well, they deserve it :p |
09:51 |
|
pulsar |
or smb |
09:51 |
|
pulsar |
or dokan/fuse |
09:51 |
|
pulsar |
there is so much crap out there |
10:06 |
|
aditsu |
anyway, in my case there's only one machine doing the locking |
10:37 |
|
pdurbin |
pulsar: What problem are you trying to solve? The customer says your app is slow? |
11:00 |
|
pulsar |
pdurbin: not really. i am thinking ahead. |
11:01 |
|
pulsar |
implementing an prototype as we speak and try to keep the architecutre in the back of my head if want to push it live |
11:01 |
|
pulsar |
and that would mean 3.000.000 clients |
11:01 |
|
pulsar |
request comes in, server delivers a a promise with the url containing the result |
11:02 |
|
pulsar |
client comes back and fetches the responses |
11:02 |
|
pulsar |
the tricky part: it has to be streamed all the way through. i cannot precache the response and serve that to the client |
11:03 |
|
pulsar |
but rather pass the result output stream to the client directly. |
11:03 |
|
pulsar |
to be scalabe / fit into the deployment platform, i need my (micro) services to be stateless |
11:05 |
|
pulsar |
so i cannot store references to the streams in the jvm but rather have to figure a way how to pipe it between instances |
11:06 |
|
pulsar |
does that make any sense? |
11:07 |
|
pulsar |
for the prototype i am using only one jvm, so i can/will store the input stream somewhere inside a map connected to the worker thread |
11:07 |
|
pulsar |
and wait for client's stream.read() to do the actuall response reading inside the worker thread. |
11:08 |
|
pulsar |
either using a stream proxy / wrapper or by passing the output stream directly to the consumer |
11:10 |
|
pulsar |
... implementation details. anway. this will obviously only work when the initial request firing of the processing thread and the request asking for the result are bound to the same jvm. i could use some kind of sticky sessoins / distributed hashtables / whatnot to make every client hit the same server over and over again based on the user id or something |
11:10 |
|
pulsar |
but this will have implications on the scalability and will not be as easy as firing up a few more instances behind the ha proxy. |
11:21 |
|
aditsu |
damn, java still doesn't have a (cross-platform) way to get the application data location |
11:22 |
|
pulsar |
yeah, not natively. |
11:22 |
|
pulsar |
there is a whole ecosystem evolved around this question. |
11:26 |
|
aditsu |
pulsar: do you have a recommended solution? |
11:28 |
|
pulsar |
by the deployment architecture? |
11:28 |
|
pulsar |
sort of, they have an actor model |
11:28 |
|
pulsar |
but that would require my application to live within an preconfigured jvm environment |
11:28 |
|
pulsar |
which is not an option right now |
11:29 |
|
pulsar |
since i have to use http/2 |
11:29 |
|
pulsar |
and this requires a modified boot classpath as of jdk8 |
11:29 |
|
aditsu |
um.. I'm talking about the application data folder |
11:29 |
|
pdurbin |
It's good to think ahead. |
11:30 |
|
pulsar |
aditsu: come again? |
11:30 |
|
pulsar |
pdurbin: thats what i am being payed for :) |
11:31 |
|
aditsu |
pulsar: I need a way to get the application data location, to write data files in there, you said there's a whole ecosystem? or were you talking about your stuff? |
11:31 |
|
pulsar |
oh, right. yeah, i was talking about my stuff |
11:32 |
|
pulsar |
but i see you point now |
11:32 |
|
pulsar |
actually i did experience that pain aswell |
11:32 |
|
pulsar |
ended up putting everything into the jar and using class.getResource* |
11:32 |
|
pulsar |
which is fine... for static stuff. |
11:33 |
|
aditsu |
no go, I need to write stuff at runtime |
11:34 |
|
aditsu |
most people seem to do some OS sniffing, env. variable juggling and sometimes JNA calls |
11:34 |
|
aditsu |
unless they just dump things in user.home :p |
11:34 |
|
pulsar |
sounds like a perfectly stable soltuion.... so, why not bite the bullet and pass it via -Dfoo.location=/home/foo/bar ? |
11:35 |
|
aditsu |
the end user might not have any concept of command line arguments |
11:37 |
|
aditsu |
(and no clue whatsoever about where applications are supposed to store their data) |
11:57 |
|
pulsar |
enduser, right. i keep on forgetting. |
12:05 |
|
aditsu |
windoze also has this concept of a "roaming profile".. |
14:57 |
|
|
df0 joined ##friendlyjava |
16:03 |
|
aditsu |
damn, I got pretty much everything working, now hit a java bug >_< |
16:17 |
|
aditsu |
hm, that bug is benign, I had another bug in my code.. |