Giter VIP home page Giter VIP logo

ali-ons's Introduction

ali-sdk

NPM version build status Test coverage Gittip David deps iojs version node version npm download

SDK include all aliyun, taobao, tmall, alibaba open serivces.

Goal of this module

Let global users can all use ali's services more easily.

Support Services

aliyun

name status description version usage origin api
OSS DONE Simple Store like S3 - OSS Usage OSS API
OTS TODO Table Store like HBase - OTS Usage OTS API
OCS ING Cache Service like Memcached - OCS Usage OCS protocol
ECS TODO Elastic Compute like EC2 - ECS Usage -
RDS ING Relational Database like MySQL - RDS Usage -
DRDS TODO Distribute Relational Database - DRDS Usage DRDS API
SLB TODO Server Load Balancer - SLB Usage -
CDN TODO Content Delivery Network v1.6 2014-10-01 CDN Usage CDN API
SLS TODO Simple Log Service - SLS Usage SLS API
MQS TODO Message Queue 2014-07-08 MQS Usage MQS-API
OpenSearch TODO Search Engine - OpenSearch Usage OpenSearch API
MTS TODO Multimedia Transcoding Service v1501 MTS Usage MTS API
ACE TODO Aliyun Cloud Engine - ACE Usage [ACE API]
ESS TODO Elastic Scaling - ESS Usage ESS API
OAS TODO Archive Service - OAS Usage OAS API
KVStore ING Key-Value Store like Redis - KVStore Usage KVStore API
ODPS TODO Data Processing like Hadoop - ODPS Usage ODPS API
ADS TODO Analytic Database, Realtime OLAP - ADS Usage [ADS API]

taobao

TBD

tmall

TBD

alibaba

TBD

License

MIT

ali-ons's People

Contributors

dead-horse avatar denghongcai avatar echosoar avatar fengmk2 avatar gxcsoccer avatar marvinwilliam avatar ngot avatar orangemi avatar plusmancn avatar sabakugaara avatar wilderchen avatar wujia avatar zzzs avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ali-ons's Issues

使用最新代码的 nameSrv 配置,仍然无法正常使用公网区域消息队列实例

#60 问题回复之后,更新最新代码,使用公网区域下的实例(仅有 TCP 协议接入点),仍然出现错误。

$ node producer.js

{ MQClientException
    at MQClient._defaultHandler (/Users/bocai/study/npm/ali-ons/lib/mq_client_api.js:559:17)
    at MQClient.getTopicRouteInfoFromNameServer (/Users/bocai/study/npm/ali-ons/lib/mq_client_api.js:197:14)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:189:7)
    at Function.Module.runMain (module.js:696:11)
    at startup (bootstrap_node.js:204:16)
    at bootstrap_node.js:625:3 name: 'MQClientException', code: undefined }

MQProducer.close() 无法彻底关闭底层资源

背景: 因为 Producer 并不会持续发送数据,所以希望在收到任务调度的时候,初始化 Producer 并处理异步任务进行发送,任务结束后,销毁 Producer 以免占用额外的资源(CPU,内存,socket 连接等)

问题: 使用 Producer 发送数据后,看到 socket 的建立以及周期任务的执行;但调用 .close() 方法后,日志显示已经 unregister producer 并且 producer close 了,但已建立的 socket 连接依然是 ESTAB 状态,且日志依然周期性的输出 mq 相关任务的执行

ali-one 版本: 3.6.5
node: 10.9.0

----------- 2019-06-19 22:23--------
排查发现是因为 _producerTable 里面除了自己注册上去的 producer 外,还有一个 defaultProducer。 在 close 的时候,自己的 producer 移除掉了,但是 defaultProducer 还在, 导致 mq_client 不能关闭 mq_client_api.

是否可以考虑在 close 时检查当前是否只剩一个 defaultProducer,如果是的话就将其一并关掉,如果还有其他 Producer 或 Consumer 则继续保留。

文档不够啊

希望完善文档啊 操作说明 以及内部方法属性

how to connect to apache Rocketmq 4.x?

I got error log when connect to apache rq 4.4 . Dose ali-one support it ?

        com.aliyun.openservices.ons.api.exception.ONSClientException: Connect broker failed, Topic=DevStatus, msgId=null

See http://docs.aliyun.com/cn#/pub/ons/faq/exceptions&connect_broker_failed for further details.

at com.aliyun.openservices.ons.api.impl.rocketmq.ProducerImpl.checkProducerException(ProducerImpl.java:213)
at com.aliyun.openservices.ons.api.impl.rocketmq.ProducerImpl.send(ProducerImpl.java:136)
at com.aliyun.openservices.ons.api.bean.ProducerBean.send(ProducerBean.java:58)

promise 支持

需求

目前 async await 已经正式可以使用,所以支持 Promise 接口势在必行

Not found, V3_0_6_SNAPSHOT maybe this group consumer boot first

当 broker对fetchConsumeOffset请求返回错误信息 “Not found, V3_0_6_SNAPSHOT maybe this group consumer boot first”,rocket sdk并未做任何处理,仍是返回默认为-1的offset,直接影响新的消费组无法消费历史消息。

    long minOffset =
                    this.brokerController.getMessageStore().getMinOffsetInQuque(requestHeader.getTopic(),
                        requestHeader.getQueueId());
 
            if (minOffset <= 0
                    && !this.brokerController.getMessageStore().checkInDiskByConsumeOffset(
                        requestHeader.getTopic(), requestHeader.getQueueId(), 0)) {
                responseHeader.setOffset(0L);
                response.setCode(ResponseCode.SUCCESS);
                response.setRemark(null);
            }
            else {
                response.setCode(ResponseCode.QUERY_NOT_FOUND);
                response.setRemark("Not found, V3_0_6_SNAPSHOT maybe this group consumer boot first");
            }

通过源码可以看到如果消费组信息并没有存储在broker上则默认返回该错误。因此对于大多数并未堆积过多数量消息的情况下,可以返回offset为0.

broker端的tag过滤无效

通过Consumer实例使用过滤tag无效:

consumer.subscribe('rocker_mq', 'rock_tig', async function(msg,mq,pg) {
    console.log(`开始消费消息, msgId: ${msg.msgId}, body: `);)
});

上述片段的回调无法执行。

consumer.subscribe('rocker_mq', '*', async function(msg,mq,pg) {
    if(msg.tags == 'rock_tig')
        console.log(`开始消费消息, msgId: ${msg.msgId}, body: `);)
});

只能采用在客户端进行过滤的策略,浪费带宽

[BUG] 阿里云 ONS 后台消息验证功能,在消费节点正常连接的情况下,报验证失败。

在阿里云后台点击 消息查询->按 Topic 查询,选择某条历史消息,点击 消息详情,假如当前 topic 下有消费机在线,你能看到如下界面

image

此时点击消费验证,会出现如下界面,在这里我们可以选择特定的机器进行消息验证

但是系统会返回如下报错,事实上消费机是能够收到消息,并且正确消费的,如第一张图所示。
消息验证的功能,对于系统接入调试很有帮助,怀疑消息验证的的协议当前 SDK 还未实现。

image

MQPushConsumer occurred an error socket hang up

阿里云官方文档中,有提到:

网络访问说明

在使用消息队列 RocketMQ 时,请注意以下网络访问限制:

只有在同一个地域下的同一个实例中的 Topic 和 Group ID 才能互通,即某 Topic 是在哪个地域的哪个实例中创建的,它就只能被同样在该地域下的该实例中的创建的 Group ID 对应的生产端和消费端访问。

例如,当某 Topic 是创建在华北 2下的实例 A 中,那么该 Topic 只能被在华北 2下的实例 A 中创建的 Group ID 对应的生产端和消费端访问。

如果只是测试,或者需要在本地(非阿里云 ECS 服务器)使用消息队列 RocketMQ 的服务,请将 Topic 和 Group ID 都创建在“公网”地域下的实例中。 生产端和消费端可以部署在本地或者部署在任意地域的 ECS 上,前提是本地服务器或者相应的 ECS 需要能够访问公网。但注意遵循上一条原则,Topic 不能跨实例使用。

测试说明

在"公网"区域下创建了一个实例,该实例只有 TCP 协议接入点。

{ ResponseError: MQPushConsumer occurred an error socket hang up, GET http://MQ_INST_125036_BaXaRFt4.mq-internet-access.mq-internet.aliyuncs.com:80 -1 (connected: true, keepalive socket: false, socketHandledRequests: 1, socketHandledResponses: 0)
headers: {}
at createHangUpError (_http_client.js:342:15)
at Socket.socketOnEnd (_http_client.js:437:23)
at emitNone (events.js:111:20)
at Socket.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:139:11)
at process._tickCallback (internal/process/next_tick.js:181:9)
code: 'ECONNRESET',
name: 'ResponseError',
data: undefined,
path: '/',
status: -1,
headers: {},
res:
{ status: -1,
statusCode: -1,
statusMessage: null,
headers: {},
size: 0,
aborted: false,
rt: 101,
keepAliveSocket: false,
data: undefined,
requestUrls:
[ 'http://mq_inst_125036_baxarft4.mq-internet-access.mq-internet.aliyuncs.com:80/' ],
timing: null,
remoteAddress: '112.124.141.191',
remotePort: 80,
socketHandledRequests: 1,
socketHandledResponses: 0 } }

请问,这个是什么问题呢

Unit Test

跑本地的单元测试不通过, 而且是很简单的配置错误, 这样的代码质量令人堪忧
image

无法正常使用rocketmq

[Wed Dec 04 2019 21:14:05 GMT+0800 (**标准时间)][pid: 7268][MQProducer] MQClientException: MQPushConsumer occurred an errorMQPushConsumer occurred an error [mq:client] updateAllTopicRouterInfo occurred error, Error Stack: MQClientException: MQPushConsumer occurred an error [mq:client] updateAllTopicRouterInfo occurred error, at MQClient._defaultHandler (/Users/huanhuiliu/Project/demo/node_modules/ali-ons/lib/mq_client_api.js:559:17) at MQClient.getTopicRouteInfoFromNameServer (/Users/huanhuiliu/Project/demo/node_modules/ali-ons/lib/mq_client_api.js:197:14) at processTicksAndRejections (internal/process/task_queues.js:93:5) Error Additions: code: undefined

并发性能

我当前的consumer,单进程下,系统资源消耗 ~100M 内存,20% CPU,TPS 只有 30-40/s,并发性明显不够。

重试与死信队列支持

目前的重试好像是在consumer端的循环,并没有发送类似于RECONSUME_LATER的消息;另外,死信队列现在是不是也不支持呢?

多次实例化Producer会出现TBW102异常

变量多次实例化Producer会出现 以下问题:
No topic route info in name server for the topic: TBW102
See http://rocketmq.apache.org/docs/faq/ for further details.
See http://rocketmq.apache.org/docs/faq/ for further details.

如果是仅实例一次 client 就不会出现这个问题
如果producer 多次实例化就就会出现

class MQProducerService extends Service { async send(topic, tags, payload, opts) { const logger = this.ctx.logger; const producer = new Producer(opts); let sendResult; try { const msg = new Message(topic, tags, JSON.stringify(payload)); sendResult = await producer.send(msg); } catch (err) { logger.error(err); } return sendResult; } }

不支持公网的消息队列吗?

image
你好,我在用公网的消息队列做测试,发消息的时候,一直在报公网的接入点无法正常访问。是我的使用方式有问题吗?翻遍了文档,也找不到具体问题在哪里。请求解答
image

时间戳解析

当使用CONSUME_FROM_TIMESTAMP设置消费位点时,解析为时间戳的方法错误:

exports.parseDate = function(str) {
  return new Date(
    Number(str.slice(0, 4)),
    Number(str.slice(4, 6)) - 1,
    Number(str.slice(6, 8)),
    Number(str.slice(6, 8)),
    Number(str.slice(10, 12)),
    Number(str.slice(12)));
};

改为

exports.parseDate = function(str) {
  return new Date(
    Number(str.slice(0, 4)),
    Number(str.slice(4, 6)) - 1,
    Number(str.slice(6, 8)),
    Number(str.slice(8, 10)),
    Number(str.slice(10, 12)),
    Number(str.slice(12)));
};

begg 3.5.1 不能订阅消息

单例测试,只包括begg和egg-metaq等最小基础环境,begg3.5.0可以订阅消息,3.5.1不能订阅消息

怀疑存在内存泄漏

背景:2.0.4版本线上环境多个ons消费端服务集体OOMKill。
现象:多个消费者服务启动时间相同,但大约8-9小时后集体OOM,可确定无消息处理的消费者也会OOM。
测试:
1、ali-ons 2.0.4
2、只启动消费端服务,不生产消息进行测试且消费端服务只启动ons消费者subscribe,无任何其它逻辑。
3、服务刚启动时50M,17个小时后稳定在225-230M,高峰283M,测试环境容器限制最大300M,超过则重启服务;
目前看,在跑几个小时就该溢出了,所以怀疑这个版本仍然存在内存泄漏的问题或是ali-ons是否有最低内存要求? 麻烦作者看看,谢谢。

消费失败后,如何重新拉取数据?

消费失败后,如何从指定点位重新拉取数据,没有 ack 机制吗,只能重启服务,重新 consumer.subscribe 传入 consumeFromWhere 来拉取吗?

那假如一次性拉取 32 条,并行处理,发现第一条消费失败,那要再一次重新拉取 32 条,会有重复数据,设置成一次拉取 1 条的话,效率又不行。。。

设置延时发送时,msgId 不一致

使用过程中发送,在 Message含有 delay 参数的情况下,消费者和生产者各自获取到的 msgId 不一致!
测试代码如下:

'use strict';
const co = require('co');
const producer = require('./alionsProducer');

co(function *() {
    for (let i = 0; i < 15; i++) {
        // co(producer.send({ a: 1, b: 2 }, {
        //     delay: i,
        // }));
        let result = yield producer.send({a:i,b:2}, {
            delay: i
        });
        console.log(`第 ${i} 次:${JSON.stringify(result)}`);
    }
});

如果将 delay: i 换成 delay: 0 则接收到的 msgId 一致
send 是对 producer 封装的一个代码:

function *send(content, options) {
        let msg = new Message(
        options.topic || 'Message_test_11',
        options.tag || '*',
        JSON.stringify(content)
    );

    if(options.delay) {
        msg.delayTimeLevel = options.delay;
    }
   
    let result = yield producer.send(msg);
    return result;
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.