小编Sha*_*baz的帖子

LMAX的破坏模式如何运作?

我试图理解破坏者的模式.我看过InfoQ视频,试图阅读他们的论文.我知道有一个环形缓冲区,它被初始化为一个非常大的数组,以利用缓存局部性,消除新内存的分配.

听起来有一个或多个原子整数可以跟踪位置.每个"事件"似乎都得到一个唯一的id,它在环中的位置是通过找到与模数相关的模数等来找到的.

不幸的是,我没有直观的感觉它是如何工作的.我做了很多交易应用程序并研究了演员模型,看过SEDA等.

在他们的演讲中他们提到这种模式基本上是路由器的工作方式; 但是我还没有找到路由器如何工作的任何好的描述.

是否有一些更好解释的好指示?

concurrency latency actor disruptor-pattern

202
推荐指数
5
解决办法
7万
查看次数

Java执行程序:如何在任务完成时通知而不阻塞?

假设我有一个完整的任务队列,我需要提交给执行程序服务.我希望他们一次处理一个.我能想到的最简单的方法是:

  1. 从队列中获取任务
  2. 将其提交给遗嘱执行人
  3. 在返回的Future上调用.get并阻塞,直到结果可用
  4. 从队列中取出另一项任务......

但是,我试图完全避免阻塞.如果我有10,000个这样的队列,需要一次处理一个任务,我将耗尽堆栈空间,因为它们中的大多数将保持被阻塞的线程.

我想要的是提交一个任务并提供一个在任务完成时调用的回调.我将使用该回叫通知作为发送下一个任务的标志.(functionaljava和jetlang显然使用了这种非阻塞算法,但我无法理解他们的代码)

如何使用JDK的java.util.concurrent,而不是编写自己的执行器服务?

(向我提供这些任务的队列本身可以阻止,但这是一个需要解决的问题)

java callback notify executor

139
推荐指数
7
解决办法
12万
查看次数

如何将Java对象(bean)转换为键值对(反之亦然)?

假设我有一个非常简单的java对象,它只有一些getXXX和setXXX属性.此对象仅用于处理值,基本上是记录或类型安全(和性能)映射.我经常需要将此对象转换为键值对(字符串或类型安全)或从键值对转换为此对象.

除了反射或手动编写代码来进行此转换之外,实现此目的的最佳方法是什么?

一个示例可能是通过jms发送此对象,而不使用ObjectMessage类型(或将传入消息转换为正确类型的对象).

java reflection collections javabeans

89
推荐指数
6
解决办法
18万
查看次数

将大量有序时间序列数据存储在大型衍生品中

我试图弄清楚这些新的数据存储如bigtable,hbase和cassandra到底是什么.

我处理大量的股票市场数据,数十亿行价格/报价数据,每天可以累计达到100千兆字节(尽管这些文本文件通常压缩至少一个数量级).这个数据基本上是一些数字,两个或三个短字符串和一个时间戳(通常是毫秒级).如果我必须为每一行选择一个唯一的标识符,我将不得不选择整行(因为交换可能会在同一毫秒内为同一个符号生成多个值).

我想将这些数据映射到bigtable(我包括它的衍生物)的最简单方法是按符号名称和日期(这可能会返回一个非常大的时间序列,超过百万个数据点并非闻所未闻).通过阅读他们的描述,看起来这些系统可以使用多个密钥.我还假设十进制数不是键的好选择.

其中一些系统(例如Cassandra)声称能够进行范围查询.在给定的一天,上午11:00到下午1:30之间,我是否能够有效地查询MSFT的所有值?

如果我想搜索给定日期的所有符号,并请求价格在10美元到10.25美元之间的所有符号,那么该怎么办?所以我正在搜索这些值,并希望返回键作为结果?

如果我想得到两个系列,从另一个中减去一个,并返回两次系列及其结果,我将在自己的程序中做他的逻辑怎么办?

阅读相关论文似乎表明这些系统不适合大规模时间序列系统.但是,如果谷歌地图等系统基于它们,我认为时间序列也应该有效.例如,将时间视为x轴,将价格视为y轴,将符号视为命名位置 - 突然之间看起来像bigtable应该是时间序列的理想存储(如果整个地球可以存储,检索,放大和注释,股市数据应该是微不足道的).

有些专家可以指出我正确的方向或澄清任何误解.

谢谢

finance hbase bigtable time-series cassandra

38
推荐指数
3
解决办法
2万
查看次数

Node.js for lua?

我过去几天一直在玩node.js(nodejs),这太棒了.据我所知,lua没有类似的libev和libio集成,让我们可以避免几乎任何阻塞调用,并以异步方式与网络和文件系统进行交互.

我正在慢慢地将我的java实现移植到nodejs,但是我很震惊luajit比v8 JavaScript快得多并且使用的内存要少得多!

我想在这样的环境中编写我的服务器(非常快速和响应,内存使用率非常低,非常有表​​现力)将极大地改善我的项目.

作为lua的新手,我只是不确定是否存在这样的事情.我会感激任何指针.

谢谢

lua libevent node.js

32
推荐指数
5
解决办法
1万
查看次数

Spark,Hadoop和Cassandra之间的关系是什么?

我的理解是Spark是Hadoop的替代品.但是,在尝试安装Spark时,安装页面会要求安装现有的Hadoop.我无法找到任何澄清这种关系的东西.

其次,Spark显然与Cassandra和Hive有良好的连接.两者都有sql风格的界面.但是,Spark有自己的sql.为什么人们会使用Cassandra/Hive而不是Spark的原生sql?假设这是一个没有现有安装的全新项目?

hadoop cassandra apache-spark apache-spark-sql

27
推荐指数
2
解决办法
1万
查看次数

java分布式缓存,用于低延迟,高可用性

我从来没有使用分布式缓存/ DHT,如memcached,jboss缓存,ehcache等.我想知道哪些,如果有的话,适合我的使用.

首先,我不是在做Web应用程序(因为大多数这些项目似乎都面向Web应用程序).我为金融交易公司编写服务器(实际上是订单管理系统).服务器本身并不复杂.他们需要接收信息(市场数据,订单,执行等)将它们发送到目的地,同时可能转换其中一些消息.

我正在研究这些产品以解决以下问题:

  • 安全的服务器状态存储库.我宁愿将我的应用程序的逻辑构建为一堆变换器(类似于Apache Camel)并将状态存储在"安全"的位置

  • 应该分发这个存储库:如果这些数据中的一个存储崩溃,那么应该有一个或两个存储崩溃,我应该能够无缝切换到它们

  • 这个存储库应该很快.这里使用单位数毫秒,换句话说,使用/处理此数据的系统是自动化系统,而不是人类点击链接.该系统需要具有高吞吐量低延迟.通过在进程外发送我的数据,我必然会降低性能,但我试图平衡绝对原始速度和绝对数据保护.

  • 这个存储库应该是安全的.与几个在线备份相似,该系统需要将数据写入磁盘(可能多于一个磁盘).

我真的想停止编写自己的"交易服务器".我是否正确地研究诸如jboss cache,ehcache等项目?

谢谢

java caching trading dht

25
推荐指数
2
解决办法
1万
查看次数

字符串上的唯一整数/长哈希密钥生成,以便更快地进行比较

我很好奇其他人是如何解决这个问题的,以及天真解决方案背后可能存在的问题:

我有一个处理股市数据的系统.有数以万计的符号,以及相关的价格/大小,以每毫秒几千的速率流入系统.

需要在每个tick上进行的基本操作之一是字符串比较,以查看传入是否匹配我们感兴趣的符号.在如此高的频率下,这些字符串比较的优化可以使整个系统的性能产生可测量的差异.

我正在考虑生成符号字符串的哈希值,并将其与记录一起存储.对于后续比较,系统应使用此哈希(为int或long,比较应该是单个操作,而不是遍历字符串的每个字符,直到找到不匹配).

让我们忽略生成散列本身的成本(实际上,这可能实际上是禁止的).我能看到的唯一问题是,对于大量唯一符号,哈希冲突(两个单独的符号生成相同的哈希)将是毁灭性的.是否有一个散列算法可以保证匹配某些约束的字符串(例如字符数限制)是唯一的?

编辑:我将用Java编写此代码.不确定hashCode的(碰撞)质量或计算速度.

string algorithm hash comparison

24
推荐指数
2
解决办法
1万
查看次数

当tcp/udp服务器发布速度超过客户端消耗时会发生什么?

我试图了解当服务器发布(通过tcp,udp等)比客户端可以使用数据更快时会发生什么.

在一个程序中,我理解如果队列位于生产者和消费者之间,它将开始变大.如果没有队列,那么生产者将无法生产任何新的东西,直到消费者可以消费(我知道可能有更多的变化).

我不清楚当数据离开服务器(可能是不同的进程,机器或数据中心)并发送到客户端时会发生什么.如果客户端根本无法足够快地响应传入数据,假设服务器和消费者耦合非常松散,那么飞行中数据会发生什么?

我在哪里可以阅读以获取有关此主题的详细信息?我只需要阅读TCP/UDP的低级细节吗?

谢谢

sockets networking udp tcp

23
推荐指数
2
解决办法
9589
查看次数

如何在vim中编辑多列中的文本

如何通过在任意数量的列中显示我的代码来编辑我的代码?

我的笔记本电脑和台式机显示器是宽屏的(我怀疑在过去的5年或10年中制造的大多数显示器都是如此!).当我打开任何编辑器全屏时,超过一半的屏幕是完全空的.我希望能够通过将其分成两列或三列来有效地使用屏幕的其余部分,这样我就可以在一个屏幕上看到更多的代码.

坦率地说,除了Word之外,我很惊讶,我从未在任何编辑器中看到过这个功能.

我发现以下页面(http://vim.wikia.com/wiki/View_text_file_in_two_columns)似乎做了我想要的,但我真的不明白他们的建议.我确实设置了列并滚动绑定,但这似乎没有做任何事情.

我通常不使用VIM,但如果我可以访问此功能,我会愉快地切换.我目前在Ubuntu 10.10(gnome)上.vim的默认版本似乎是7.2 /usr/bin/vim.gnome

vi vim multiple-columns

23
推荐指数
1
解决办法
1万
查看次数